Как заменить регулярные выражения регулярных выражений с помощью perl в командной строке - PullRequest
0 голосов
/ 19 марта 2019

Привет, я новичок в использовании perl, и я хотел бы знать, как использовать его для замены регулярных выражений в многострочном режиме.И если возможно, также сделать "."совпадать с линиями разрыва.

Я использую следующее выражение:

perl -pe 's/text.*end/textChanged/g' myFile.txt

Выражение выше заменить в однострочном режиме.Он не учитывает разрыв строки.

Использование: Windows Stranberry Perl

1 Ответ

3 голосов
/ 19 марта 2019

Обратите внимание, что в 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 в регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...