Скрипт Perl против однострочного - различия в функциональности с помощью регулярных выражений - PullRequest
2 голосов
/ 07 июня 2019

У меня есть Perl-программа, которая принимает STDIN (переданный из другой команды bash).Вывод команды bash довольно большой, около 200 строк.Я хочу взять весь ввод (несколько строк) и передать его в однострочный скрипт Perl, но пока ничего из того, что я пробовал, не сработало.И наоборот, если я использую следующий perl (файл .pl):

#!/usr/bin/perl
use strict;

my $regex = qr/{(?:\n|.)*}(?:\n)/p;

if ( <> =~ /$regex/g ) {
  print "${^MATCH}\n";
}

и выполняю команду bash следующим образом:

<bash command> | perl -0777 try_m_1.pl

Это работает.Но, как однострочный, он не работает с той же командой regex / bash.Результат команды print - ничто.Я пробовал это так:

<bash command> | perl -0777 -e '/{(?:\n|.)*}(?:\n)/pg && print "$^MATCH";'

и это:

<bash command> | perl -0777 -e '/{(?:\n|.)*}(?:\n)/g; print "$1\n";'

И еще куча других вещей, слишком много, чтобы перечислить их все.Я новичок в Perl и хочу использовать его только для получения вывода регулярных выражений из текста.Если есть что-то лучше, чем Perl, чтобы сделать это (я так понимаю, прочитав, что sed не будет работать для этого?), Не стесняйтесь предлагать.

Обновление: на основе ответа @zdim, я попробовал следующее, чтосработало:

<bash command> |  perl -0777 -ne '/(\{(?:\n|.)*\}(?:\n))/s and print "$1\n"'

Полагаю, мое регулярное выражение нужно было обернуть в (), а фигурные скобки { нужно экранировать.

1 Ответ

4 голосов
/ 07 июня 2019

Однострочнику требуется -n (или -p) для обработки ввода, чтобы открыть файлы, присоединить потоки и настроить цикл. Это все еще необходимо, даже когда -0777 отменяет разделитель входной записи , поэтому файл читается сразу; смотрите Зачем использовать -p | -n в режиме slurp в perl one liner?

Это регулярное выражение соответствует либо новой строке, либо любому символу, отличному от новой строки, и для этого существует модификатор /s, с которым . также соответствует символу новой строки. Тогда это должно быть внутри фигурных скобок, которые вы должны избежать в новых Perls. Следующая строка не нуждается в группировке.

Так что в целом у вас будет

<bash command> | perl -0777 -ne'/(\{(.*)\}\n)/s and print "$1\n"'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...