У меня есть файл, который содержит много из них
"/watch?v=VhsnHIUMQGM"
, и я хотел бы вывести буквенный код, используя однострочную строку perl. Поэтому я пытаюсь
perl -nle 'm/\"\/watch\?v=(.*?)\"/g' filename.txt
, но он ничего не печатает.
Что я делаю не так?
Опция -n
обрабатывает каждую строку, но ничего не выводит. Поэтому вам нужно добавить явный print
, если вы успешно сопоставили.
perl -ne 'while ( m/\"\/watch\?v=(.+?)\"/g ) { print "$1\n" }' filename.txt
Другой подход, если вы уверены, что все строки будут совпадать, заключается в использовании опции -p
, которая выводит значение $_
после обработки, например:
perl -pe 's/\"\/watch\?v=(.+?)\"/$1//' filename.txt
Вы можете разделить строку на "="
вместо сопоставления:
perl -paF= -e '$_= @F[1]' filename.txt
Ваше регулярное выражение в порядке. Вы не получаете вывода, потому что опция -n
ничего не печатает. Он просто окружает вашу программу циклом while (<>) { ... }
(запустите perl --help
для краткого объяснения параметров Perl).
В следующем примере используется ваше регулярное выражение, но добавлена печать. В контексте списка регулярные выражения с параметром /g
возвращают все записи. По сути, мы печатаем каждый захват.
perl -nle 'print for m/\"\/watch\?v=(.*?)\"/g' data.dat