【问题标题】:What am I doing wrong in this Perl one-liner?我在这个 Perl 单行代码中做错了什么?
【发布时间】:2010-08-28 13:44:10
【问题描述】:

我有一个包含很多这些的文件

"/watch?v=VhsnHIUMQGM"

我想使用 perl 单行输出字母代码。所以我试试

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

但它不打印任何东西。

我做错了什么?

【问题讨论】:

标签: perl


【解决方案1】:

-n 选项处理每一行,但不打印任何内容。所以如果匹配成功则需要显式添加print。

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 是否值得添加 \n 以便分离捕获?
    • @PP -l 选项处理这个问题。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 2015-04-23
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多