Что я делаю не так в этом Perl однострочном? - PullRequest
7 голосов
/ 28 августа 2010

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

"/watch?v=VhsnHIUMQGM"

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

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

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

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

Ответы [ 3 ]

13 голосов
/ 28 августа 2010

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

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

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

perl -pe 's/\"\/watch\?v=(.+?)\"/$1//' filename.txt
6 голосов
/ 28 августа 2010

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

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

perl -nle 'print for m/\"\/watch\?v=(.*?)\"/g' data.dat
1 голос
/ 28 августа 2010

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

perl -paF= -e '$_= @F[1]' filename.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...