Как преобразовать сложные команды sed в скрипт PowerShell - PullRequest
1 голос
/ 11 июня 2019

У меня есть пакетный файл Windows, который использует sed для работы с файлами.Манипуляция включает в себя простые замены, такие как

sed -e s/PATTERN/OTHERS/g                 infile >outfile
sed -e "/^.*COPY_START/,/^.*COPY_END/ d"  infile >outfile

. В то время как первый может быть заменен на

Get-Content infile | %{ $_ -replace 'PATTERN', 'OTHERS' } | Set-Content outfile

Я не нашел, как выбрать группу строк, которые будут удаленымаркеры строки COPY_START и COPY_END.

Как эти команды sed можно заменить на PowerShell.

Редактировать: Что касается комментария Джеффа, я пытался пойматьмногострочная проблема с этим кодом:

Get-Content infile -replace '(.*)COPY_START\n.*COPY_END(.*)','$1$2'

Но \n не удовлетворяет критериям поиска.Чтобы выделить критерий «многострочный», я использовал

Get-Content infile -match 'COPY_START\n.*COPY_END'

с этим файлом

before
do COPY_START
skip
until COPY_END
after

Но совпадение всегда $False.Я ожидал, что выражение \n.* должно совпадать с концом строки после COPY_START и всеми строками до появления COPY_END.

Почему не совпадает с регулярным выражением и как его исправить?

1 Ответ

2 голосов
/ 11 июня 2019

Команда sed -e "/^.*COPY_START/,/^.*COPY_END/ d" infile >outfile находит все подстроки между строками, имеющими COPY_START и COPY_END, удаляет их из infile и сохраняет вывод в outfile.

Чтобы он работал в PS, вам нужно прочитать файл в одну переменную с помощью -Raw и использовать регулярное выражение, например

(?m)^.*COPY_START(?s:.*?)COPY_END.*$\n?

См. Демоверсию regex .

Детали

  • (?m) - встроенный модификатор MULTILINE, ^ теперь будет соответствовать началу строки
  • ^ - начало строки
  • .* - любые 0+ символов, кроме LF, как можно больше
  • COPY_START - подстрока
  • (?s:.*?) - встроенная группа модификаторов (где s включает опцию RegexOptions.Singleline, также известную как DOTALL, когда . соответствует любому символу), которая соответствует любым 0+ символам, как можно меньше до первый
  • COPY_END.*$ - COPY_END, а затем любые 0+ символов, кроме новой строки, как можно больше
  • \n? - и дополнительный перевод строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...