Этот процесс должен включать обработку шаблона многострочных строк.
Я думаю, что вы лаете не на то дерево.Если вы пытаетесь сопоставить многострочный шаблон, то наиболее существенная проблема заключается не в том, как избежать шаблона, а в том, как написать сценарий sed
, который будет успешно соответствовать чему-либо.
Проблема заключается в том,sed
читает входные данные по одной строке за раз.Существуют различные способы сбора нескольких строк и работы с такими коллекциями, но вы должны сделать это явно в программе.Поэтому sed
- плохой выбор для попытки сопоставления произвольного многострочного текста.Чтобы сделать вашу задачу выполнимой, вам нужно знать, сколько строк будет содержать шаблон, чтобы написать свою программу sed
, которая будет соответствовать этому.Даже тогда это может быть лучше для Perl.
Обновление:
Поскольку мне нравится sed
, вот пример того, как вы могли бы написатьsed
Программа, которая соответствует многострочным шаблонам:
#!/bin/sed -f
# Build up a three-line window in the pattern space
:a
/\(.*\
\)\{2\}/! { N; ba; }
# A(nother) multiline pattern. If the pattern fails to match then the
# first line of the pattern space is printed and deleted, then
# we loop back to reload.
/^The\
quick\
brown$/! { P; D; ba; }
# Do whatever we want to do in the event of a match
s/brown/red/
# If control reaches here then the whole pattern space is printed,
# and if any input lines remain then we start again from the beginning
# with an initially-empty pattern space.
Пример ввода:
$ ./ml.sed <<EOF
The
quick
brown
fox
jumped over
the lazy dog.
EOF
Вывод:
The
quick
red
fox
jumped over
the lazy dog.
Обратите внимание, что переводы строк соответствуют обычным символам, но эти буквальные символы новой строки в шаблоне или тексте замены необходимо экранировать обычным образом по синтаксическим причинам.
Обновление 2 :
Вот вариант, который заменяет появленияиз трехстрочной последовательности
brown
fox
jumped over
с трехстрочной последовательностью
red
pig
is fat
.Конечно, есть много других способов сделать то же самое с sed
, и один из других может быть предпочтительнее этого для ваших конкретных целей.
#!/bin/sed -f
:a
/\(.*\
\)\{2\}/! { N; ba; }
/^brown\
fox\
jumped over$/! { P; D; ba; }
s/.*/red\
pig\
is fat/