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

时间:2010-08-28 13:44:10

标签: perl

我有一个包含大量

的文件
"/watch?v=VhsnHIUMQGM"

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

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

但它不会打印任何内容。

我做错了什么?

3 个答案:

答案 0 :(得分: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 :(得分:6)

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

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

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

答案 2 :(得分:1)

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

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