Подтвердить что ты не робот

Как выполнять поиск и замену нескольких строк на Perl?

$ perl --version
This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi

$ echo -e "foo\nbar" > baz.txt
$ perl -p -e 's/foo\nbar/FOO\nBAR/m' baz.txt
foo
bar

Как я могу заставить эту замену работать?

4b9b3361

Ответ 1

Вы можете использовать переключатель -0 для изменения разделителя ввода:

perl -0777pe 's/foo\nbar/FOO\nBAR/' baz.txt

-0777 устанавливает разделитель на undef, только -0 устанавливает его в \0, который может работать для текстовых файлов, не содержащих нулевой байт.

Обратите внимание, что /m не нужно, так как регулярное выражение не содержит ^ и $.

Ответ 2

Он связан с переключателем -p. Он считывает ввод по одной строке за раз. Таким образом, вы не можете запускать регулярное выражение против новой строки между двумя строками, потому что оно никогда не будет соответствовать. Одна вещь, которую вы можете сделать, - прочитать всю переменную изменения ввода $/ и применить к ней регулярное выражение. Один из способов:

perl -e 'undef $/; $s = <>; $s =~ s/foo\nbar/FOO\nBAR/; print $s' baz.txt

Это дает:

FOO
BAR