【问题标题】:extract only the first occurrence of the strings只提取第一次出现的字符串
【发布时间】:2012-09-10 07:31:21
【问题描述】:

我搜索了很多,但我没有找到适合我正在寻找的答案,所以我发布了这个问题。

我想提取“par”、“comp”、“order”和“nameprefix”的第一次出现。如何为示例输入执行此操作?有没有 perl oneliners 可以做到这一点?

    wertydhhdbc->auCdl = '( nil
    par    (xyz)
    comp     asd1
    order        (done)
    namePrefix        "X"
    par    (xyz)
    comp     asd
    order        (done)
    namePrefix        "R"
    namePrefix        "X"
    par    (qwer)
    comp     key
    order        (done)
    namePrefix        "X"
    comp     key
    order        (done )
    par    (qwer)
    order        (done)

【问题讨论】:

    标签: regex perl find-occurrences


    【解决方案1】:

    是的,你可以使用一个简单的 Perl 单行来显示包含例如的第一行。 par:

    perl -ne 'if (/par/) { print; last; }'  1.txt
    

    -n 开关使 perl 逐行遍历输入文件。然后,代码使其打印该行并在找到给定模式后停止。

    更新:

    要搜索每个单词的第一次出现,必须使用不同的技术:

    perl -ne 'if(/(comp|par|order)/) {$f{$1}++; print if 1 == $f{$1} ; last if 3 == keys %f}' 1.txt
    

    3 是您要搜索的字数。

    【讨论】:

    • 我可以将我想要提取的所有字符串容纳在同一个单行中吗??????例如: if (/par && comp && order/) 或任何类似的方式???
    【解决方案2】:

    假设你想要'par'、'comp'、'order'和'nameprefix'第一次出现的整行。使用\b 避免匹配诸如orders 之类的词

    print $1 if $str =~ /(\b(?:par|comp|order|nameprefix)\b.+)/
    

    这会输出

    par    (xyz)
    

    【讨论】:

      【解决方案3】:

      怎么样:

      my ($par, $comp, $order, $nameprefix) = ($str =~ /par\s+(.+?)\s+comp\s+(.+?)\s+order\s+(.+?)\s+namePrefix\s+(.+?)\s/s);
      print "par=$par\ncomp=$comp\norder=$order\nnameprefix=$nameprefix\n";
      

      输出:

      par=(xyz)
      comp=asd1
      order=(done)
      nameprefix="X"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-25
        • 2017-08-20
        • 1970-01-01
        • 2017-05-28
        • 2020-11-10
        • 2018-02-05
        • 1970-01-01
        相关资源
        最近更新 更多