2010-08-28 77 views
7

我有一个包含大量的这些我在这个Perl单行程中做错了什么?

"/watch?v=VhsnHIUMQGM" 

一个文件,我想使用输出一个perl的一行字母代码。所以我尝试

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

但它不打印任何东西。

我在做什么错?

+1

见['的perldoc perlrun'](http://perldoc.perl.org/perlrun.html) – 2011-03-28 14:26:27

回答

13

-n选项处理每行但不打印任何东西。因此,如果您成功匹配,则需要添加明确的print

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

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

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

您可以分割字符串在"="而不是匹配:

perl -paF= -e '$_= @F[1]' filename.txt 
6

你的正则表达式很好。您没有输出,因为-n选项不会打印任何内容。它只是围绕程序包装一个while (<>) { ... }循环(运行perl --help以获取有关Perl选项的简要说明)。

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

perl -nle 'print for m/\"\/watch\?v=(.*?)\"/g' data.dat 
+0

是否值得添加'\ N',使得捕获分离? – 2010-08-29 06:36:13

+0

@PP'-l'选项可以处理这个问题。 – FMc 2010-08-29 15:04:58