Замените все строки между двумя строками используя powershell - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть файл конфигурации, и я хочу заменить все строки между двумя строками с помощью powershell. Вот мой код:

 $HttpPath = "C:\Oracle\Middleware\Oracle_Home\user_projects\domains\my_domain\config\fmwconfig\components\OHS\ohs1\httpd.conf"
 $NewLine = 'Options -Indexes'
 $Pattern = '(?<=<Directory />).*?(?=</Directory>)'
(Get-Content -Path $HttpPath -Raw) | ForEach-Object {
  $_ -replace $Pattern,$NewLine
 } | Set-Content -Path $HttpPath

Вот текст конфигурации файла:

 <Directory />
 AllowOverride none
 Require all denied
 </Directory>

Я хочу заменить две строки "Hi" и "Hello" одной строкой "Options -Indexes". Результат должен выглядеть следующим образом:

<Directory />
Options -Indexes
</Directory>

Этот сценарий работает, если содержимое файла выглядит следующим образом:

<Directory /> AllowOverride none Require all denied </Directory>

Тогда вывод будет выглядеть так:

<Directory />Options -Indexes</Directory>

Но как содержимое файла разбивается на отдельные строки, это не работает.

1 Ответ

0 голосов
/ 01 апреля 2020

Вы можете сделать следующее:

$Pattern = '(?s)(?<=<Directory />\r?\n).*?(?=</Directory>)'
$NewLine = "{0}{1}" -f 'Options -Indexes',[Environment]::NewLine
(Get-Content http.conf -raw) -replace $Pattern,$NewLine | Set-Content http.conf

Объяснение:

Использование переключателя -Raw Get-Content позволяет работать с несколькими строками без необходимость хранить предыдущие линейные выходы. Он читает весь файл как одну строку вместо массива строк.

Модификатор s (используется с синтаксисом (?s)) - это однострочный модификатор. Это позволяет символу регулярного выражения . совпадать с символами новой строки, которые будут у вас, поскольку целевой текст находится между двумя другими строками.

Механизм (?<=text) является положительным взглядом позади утверждения с текущей позиции. Ожидается, что text будет позади текущей позиции. \r?\n соответствует 0 или 1 возврату каретки и 1 новой строке. text здесь не будет удалено.

Механизм (?=text) является положительным предварительным утверждением, проверяющим, что text опережает текущую позицию. text здесь не будет удалено.

-f - формат строки operator . Это не обязательно, но это полезный способ создания строки с программируемыми частями.

...