0

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

我想提取“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)
4

3 回答 3

3

是的,您可以使用一个简单的 Perl 单行代码来显示包含 eg 的第一行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 是您要搜索的字数。

于 2012-09-10T07:34:35.077 回答
1

假设您想要第一次出现“par”、“comp”、“order”和“nameprefix”的整行。用于\b避免匹配单词,例如orders

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

这将输出

par    (xyz)
于 2012-09-10T08:22:37.250 回答
0

怎么样:

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"
于 2012-09-10T08:00:43.870 回答