2015-09-10 5 views
1

У меня есть длинный файл конфигурации, в котором мне нужно вытащить подстроку, отредактировать там какой-то контент и заменить исходный контент и сохранить файл. Я совершенно новый с PowerShell, но я думаю, что последние две части, которые я могу сделать. Проблема, с которой я столкнулась, - это совпадение с регулярным выражением.Powershell Regex для подстроки над несколькими строками между двумя символами

[SECTION1] 
SETTING1=ABC 
SETTING2=DEF 
SETTING3=GHI 
[SECTION2] 
SETTING1=ABC 
ANOTHERSETTING=XYZ 
[SECTION3] 
SOMESETTING=DFH 
FINALSETTING=OWA 

Я проверил регулярное выражение на RegExr и он хорошо работает там, но у меня нет никакой радости при попытке передать, что в сценарий PowerShell.

(^\[SECTION2\](\n.+$){2}) 

То, что я хотел бы сделать, это найти «[section2]», и не совпадают всё, вплоть до следующего экземпляра «[». В настоящее время я сопоставляю «[SECTION2]» и две строки новой строки, но хотел бы совместить до следующей квадратной скобки.

Я пробовал пару команд для запуска регулярного выражения, но, похоже, ничего не возвращает мне ничего. Например:

Select-String -Path 'PATH_TO_FILE' -Pattern '(^\[SECTION2\](\n.+$){2})' 

Я делаю что-то принципиально неправильно?

ответ

1

Использование Select-String с файлом будет запускать шаблон по каждой строке отдельно, но вам нужно сопоставить весь файл как одну большую строку.

Есть также проблемы с рисунком.

Попробуйте что-то вроде этого:

$matchObjects = Get-Content 'PATH_TO_FILE' -Raw | Select-String -Pattern '(?s)\[SECTION2\]([^\[]+)' 
$contents = $matchObjects[0].Groups[1].Value 

-Raw часть, что делает Get-Content прочитать все содержимое файла вместо построчно, и она требует PowerShell 3+.

\[SECTION2\]([^\[]+) 

Regular expression visualization

Debuggex Demo

Узор ищет [SECTION2] строку, а затем захватывает группу, состоящую один или несколько символов, которые не являются [.

Вы можете использовать именованный захват группы также:

$matchObjects = Get-Content 'PATH_TO_FILE' -Raw | Select-String -Pattern '(?s)\[SECTION2\](?<Content>[^\[]+)' 
$contents = $matchObjects[0].Groups['Content'].Value 
+0

Я отредактировал мой оригинальный пост. Я подозреваю, что я неправильно понимаю реализацию, поэтому любая помощь приветствуется. Я попытался использовать регулярное выражение, которое вы предоставили, но это тоже не дало результатов. –

+0

@MikeWhitehead см. Мое редактирование. – briantist

+0

Я пробовал ваше предложение, но оно ничего не возвращает. Get-Content вытаскивает файл, так что первая часть фактически просматривает файл, но Select-String, похоже, не находит совпадения. Есть ли способ, например, совместить все между [SECTION2] и квадратной скобкой открытия [SECTION3]? –

Смежные вопросы