我在Perl单行中做错了什么?

San*_*ing 7 perl

我有一个包含很多这些的文件

"/watch?v=VhsnHIUMQGM"
Run Code Online (Sandbox Code Playgroud)

我想用perl one-liner输出字母代码.所以我试试

perl -nle 'm/\"\/watch\?v=(.*?)\"/g' filename.txt
Run Code Online (Sandbox Code Playgroud)

但它不会打印任何东西.

我究竟做错了什么?

PP.*_*PP. 13

-n选项处理每一行但不打印任何内容.因此,print如果成功匹配,则需要添加显式内容.

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

另一种方法,如果你确定每一行都匹配,就是使用-p打印出$_后处理值的选项,例如:

perl -pe 's/\"\/watch\?v=(.+?)\"/$1//' filename.txt
Run Code Online (Sandbox Code Playgroud)


FMc*_*FMc 6

你的正则表达没问题.您没有输出,因为该-n选项不会打印任何内容.它只是while (<>) { ... }在程序周围包装一个循环(运行perl --help以简要解释Perl选项).

以下使用您的正则表达式,但添加一些打印.在列表上下文中,带有该/g选项的正则表达式返回所有捕获.实际上,我们打印每个捕获.

perl -nle 'print for m/\"\/watch\?v=(.*?)\"/g' data.dat
Run Code Online (Sandbox Code Playgroud)