Perl не соответствует нескольким строкам - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу соответствовать:

Start Here Some example
text covering a few
lines. End Here

Так что я делаю

$ perl -nle 'print $1 if /(Start Here.*?)End Here/s'

, затем вставляю текст выше и ctr-D. Это не совпадает с cmd - но это происходит в файловом скрипте. Почему?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2020

Измените разделитель входной записи ($/) на ноль, используя -0 ключ командной строки.

perl -0777nle 'print $1 if /(Start Here.*?)End Here/s' <<END
Start Here Some example
text covering a few
lines. End Here
THE_END

man perlrun

-0 [восьмеричное / шестнадцатеричное]
определяет разделитель входной записи ($ /) в виде восьмеричного или шестнадцатеричного числа. […] Любое значение 0400 или выше приведет к тому, что Perl приведет к удалению файлов целиком, но по соглашению значение 0777 обычно используется для этой цели.

man perlvar

IO :: Handle-> input_record_separator (EXPR)
$ INPUT_RECORD_SEPARATOR
$ RS
$ /
Разделитель входных записей, новая строка по умолчанию. Это влияет на представление Perl о том, что такое «линия». […] Вы можете установить его в […] «undef», чтобы прочитать конец файла.

2 голосов
/ 29 апреля 2020

Как уже объясняли другие, вы читаете файл по одной строке за раз, поэтому совпадения по нескольким строкам никогда не сработают.

Чтение файлов по одной строке часто является лучшим подходом. Таким образом, мы можем использовать оператор «flip-flip» для этого:

 $ perl -nle 'print if /Start Here/ .. /End Here/' your_file_here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...