【发布时间】:2010-08-28 13:44:10
【问题描述】:
我有一个包含很多这些的文件
"/watch?v=VhsnHIUMQGM"
我想使用 perl 单行输出字母代码。所以我试试
perl -nle 'm/\"\/watch\?v=(.*?)\"/g' filename.txt
但它不打印任何东西。
我做错了什么?
【问题讨论】:
标签: perl
我有一个包含很多这些的文件
"/watch?v=VhsnHIUMQGM"
我想使用 perl 单行输出字母代码。所以我试试
perl -nle 'm/\"\/watch\?v=(.*?)\"/g' filename.txt
但它不打印任何东西。
我做错了什么?
【问题讨论】:
标签: perl
-n 选项处理每一行,但不打印任何内容。所以如果匹配成功则需要显式添加print。
perl -ne 'while ( m/\"\/watch\?v=(.+?)\"/g ) { print "$1\n" }' filename.txt
如果您确定每一行都匹配,另一种方法是使用-p 选项,该选项在处理后打印出$_ 的值,例如:
perl -pe 's/\"\/watch\?v=(.+?)\"/$1//' filename.txt
【讨论】:
你的正则表达式很好。您没有得到任何输出,因为 -n 选项不会打印任何内容。它只是在您的程序周围包裹了一个while (<>) { ... } 循环(运行perl --help 以获得Perl 选项的简要说明)。
以下使用您的正则表达式,但添加一些打印。在列表上下文中,带有/g 选项的正则表达式返回所有捕获。实际上,我们打印每个捕获。
perl -nle 'print for m/\"\/watch\?v=(.*?)\"/g' data.dat
【讨论】:
\n 以便分离捕获?
-l 选项处理这个问题。
您可以在"=" 上拆分字符串而不是匹配:
perl -paF= -e '$_= @F[1]' filename.txt
【讨论】: