0

いろいろ検索しましたが、探しているものに合う答えが見つからなかったので、この質問を投稿します。

「par」、「comp」、「order」、および「nameprefix」の最初の出現を抽出したいと考えています。入力例に対してこれを行う方法は? それを行うためのperlワンライナーはありますか?

    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 オンライン ライナーを使用して、次を含む最初の行を表示できますpar

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

この-nスイッチにより、perl は入力ファイルの行を 1 行進みます。次に、コードは行を出力し、指定されたパターンが見つかると停止します。

アップデート:

各単語の最初の出現を検索するには、別の手法を使用する必要があります。

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 に答える