我有一个包含大量
的文件"/watch?v=VhsnHIUMQGM"
我想使用perl one-liner输出字母代码。所以我试试
perl -nle 'm/\"\/watch\?v=(.*?)\"/g' filename.txt
但它不会打印任何内容。
我做错了什么?
答案 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