Обратите внимание, что в Perl one-liner используется ключ -p или -n, который скрывает цикл while за кулисами.И цикл while использует скалярный контекст, который читает строку за строкой, поэтому вы не увидите никаких изменений в вашем выводе, если только text.*end
не появится в одной строке.
Вот пример
$ cat a.txt
abc
text 1 2
2 3 4
ab end
hello
here
$ perl -pe 's/text.*end/textChanged/g' a.txt # Nothing happens - while reads line by line
abc
text 1 2
2 3 4
ab end
hello
here
Теперь вы можете, например, установить для переменной-разделителя Record значение undef
.
$ perl -pe ' BEGIN { $/=undef } s/text.*end/textChanged/g' a.txt # Nothing happens
abc
text 1 2
2 3 4
ab end
hello
here
Но при добавлении модификатора / s происходит подстановка.
$ perl -pe ' BEGIN { $/=undef } s/text.*end/textChanged/gs ' a.txt
abc
textChanged
hello
here
$
Считывание всего файла с использованием режима slurp, и опять ничего не происходит с вашей заменой.
$ perl -0777 -pe ' s/text.*end/textChanged/g ' a.txt
abc
text 1 2
2 3 4
ab end
hello
here
$
Теперь вы используете флаг / s, чтобы точка могла совпадать и с новой строкой, и замена произошла.
$ perl -0777 -pe ' s/text.*end/textChanged/gs ' a.txt
abc
textChanged
hello
here
$
Спасибо @ikegami ... за параметры пакета, как показано ниже
$ perl -0777pe ' s/text.*end/textChanged/gs ' a.txt
Поэтому, когда вы хотите, чтобы точка соответствовала символам новой строки, вам нужно добавить модификатор / s в регулярное выражение.