这个Perl一行代码有什么问题?我做错了什么?

7

我有一个文件,其中包含很多这样的内容

"/watch?v=VhsnHIUMQGM"

我希望使用Perl一行代码来输出字母代码。所以我尝试:

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

但它并没有打印任何东西。

我做错了什么?


1
请查看perldoc perlrun - Brad Gilbert
3个回答

13

-n选项会处理每一行,但不会将其打印出来。因此,如果匹配成功,你需要显式添加print命令来打印。

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

另一种方法是,如果你确信每一行都会匹配,那么可以使用-p选项,在处理后打印出$_的值,例如:

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

6
你的正则表达式没问题。你没有得到任何输出是因为 -n 选项不会打印任何东西。它只是在你的程序周围包装一个 while (<>) { ... } 循环(运行 perl --help 来获取有关 Perl 选项的简要说明)。
以下代码使用了你的正则表达式,但添加了一些打印。在列表上下文中,有 /g 选项的正则表达式返回所有捕获结果。实际上,我们打印出每个捕获结果。
perl -nle 'print for m/\"\/watch\?v=(.*?)\"/g' data.dat

值得添加\n来分隔捕获吗? - PP.
@PP -l 选项可以处理这个。 - FMc

1
你可以通过在字符串上使用"="进行分割而不是匹配:
perl -paF= -e '$_= @F[1]' filename.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接