【问题标题】:Perl oneliner match repeating itselfPerl oneliner 匹配重复自身
【发布时间】:2012-05-02 21:08:09
【问题描述】:

我正在尝试使用 Perl 从文件中读取行的特定部分。 有问题的文件具有以下语法。

# Sets $USER1$ 
$USER1$=/usr/....
# Sets $USER2$ 
#$USER2$=/usr/...

我的oneliner很简单,

perl -ne 'm/^\$USER1\$\s*=\s*(\S*?)\s*$/m; print "$1";' /my/file

由于某种原因,我多次重复提取 1 美元,显然在我的匹配发生后文件中的每一行都重复一次。我在这里错过了什么?

【问题讨论】:

  • 你需要一个条件来测试匹配,例如print if /..your regex ../;

标签: perl pcre


【解决方案1】:

您正在为文件的每一行执行打印,因为无论正则表达式是否匹配,都会为每一行调用打印。将第一个 ; 替换为 &&

【讨论】:

  • 或者在每行之后重置$1="",但这不太优雅。
  • 完美,谢谢。认为这是某种逻辑条件问题。
  • @ennukiller 你绝对可以轻松重置 1 美元。匹配变量在任何成功匹配时被重置,所以匹配 m//(空字符串)来重置它们!
【解决方案2】:

来自 perlre:

注意:Perl 中失败的匹配不会重置匹配变量,这样可以更轻松地编写代码来测试一系列更具体的情况并记住最佳匹配。

试试这个:

perl -ne 'print "$1" if m/^\$USER1\$\s*=\s*(\S*?)\s*$/m;' /my/file

【讨论】:

    【解决方案3】:
    $ cat test.txt
    # Sets $USER1$ 
    $USER1$=/usr/....
    # Sets $USER2$ 
    #$USER2$=/usr/...
    
    $ perl -nle 'print if /^\$USER1/;' test.txt
    $USER1$=/usr/....
    

    【讨论】:

      【解决方案4】:

      试试这个

      perl -ne '/^.*1?=([\w\W].*)$/;print "$1";' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        • 2018-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多