1

XML または任意のテキスト形式にすることができます。Perlでテキストブロックをgrepする一般的な方法は?

<track type="ws">
      <range>
       <rangeStart>0</rangeStart>
       <rangeEnd>146.912</rangeEnd>
       <locationIndex>0</locationIndex>
       <propertyIndex>0</propertyIndex>
      </range>
</track>
<track type="ps" id="1">
      <range>
       <rangeStart>0</rangeStart>
       <rangeEnd>146.912</rangeEnd>
       <locationIndex>1</locationIndex>
       <propertyIndex>1</propertyIndex>
      </range>
</track>

type="ps"grep して、 までのすべてを取得したい</range>

1 つの解決策は、ファイルを開き、1 行ずつ読み取ってから、ブロックを一致させることです。

open(FH, "file.txt");
foreach $line (<FH>) {
    if ($line =~ m/type="cc"(.*?)<\/range>/) {
        print $1;
    }
}

しかし、ファイルを1行ずつ読み取らずに、より最適な解決策はありますか?

4

3 に答える 3

5

Bjørn は XML に完全に適しています。より一般的な質問については、私の最もお気に入りのワンライナーの 1 つにも興味があるかもしれません。

perl -ne 'print if /type="cc"/../<\/range>/' input.txt
于 2013-05-04T07:05:55.567 に答える
0

XML については、xml_grepおよびxml_grep2を参照してください。XML は、行指向ではないという点でプレーン テキストとは大きく異なります。そのため、grep、sed、awk、ackなどの行指向のツールが適切に動作することは保証されていません。

于 2013-05-04T09:34:08.433 に答える