Что я делаю не так в этом Perl one-liner?

У меня есть файл, который содержит много из них

"/watch?v=VhsnHIUMQGM"

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

perl -nle 'm/\"\/watch\?v=(.*?)\"/g' filename.txt

, но он ничего не печатает.

Что я делаю не так?

7
задан brian d foy 15 September 2010 в 11:53
поделиться

3 ответа

Опция -n обрабатывает каждую строку, но ничего не выводит. Поэтому вам нужно добавить явный print, если вы успешно сопоставили.

perl -ne 'while ( m/\"\/watch\?v=(.+?)\"/g ) { print "$1\n" }' filename.txt

Другой подход, если вы уверены, что все строки будут совпадать, заключается в использовании опции -p, которая выводит значение $_ после обработки, например:

perl -pe 's/\"\/watch\?v=(.+?)\"/$1//' filename.txt
13
ответ дан 6 December 2019 в 09:16
поделиться

Вы можете разделить строку на "=" вместо сопоставления:

perl -paF= -e '$_= @F[1]' filename.txt
1
ответ дан 6 December 2019 в 09:16
поделиться

Ваше регулярное выражение в порядке. Вы не получаете вывода, потому что опция -n ничего не печатает. Он просто окружает вашу программу циклом while (<>) { ... } (запустите perl --help для краткого объяснения параметров Perl).

В следующем примере используется ваше регулярное выражение, но добавлена ​​печать. В контексте списка регулярные выражения с параметром /g возвращают все записи. По сути, мы печатаем каждый захват.

perl -nle 'print for m/\"\/watch\?v=(.*?)\"/g' data.dat
6
ответ дан 6 December 2019 в 09:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: