0

次のようなファイルがあります。

SF:/home/developer/project/test/resources/somefile.js
DA:1,2
DA:3,2
end_of_record
SF:/home/developer/project/src/resources/otherfile.js
DA:9,2
DA:15,2
DA:22,2
end_of_record

...some more SF:/home/xxx and end_of_record lines...

このファイルは、で始まり、SF: ...で終わるブロックで構成されていend_of_recordます。()の間の行数はDA:x,x異なる場合があることに注意してください。最初の行に文字列「test」が含まれるすべてのブロックを出力したいと思います(ここでは「SF:/ home /developer / test / resources / ...」のように)。この例では、必要な出力は次のようになります。

SF:/home/developer/project/test/resources/somefile.js
DA:1,2
DA:3,2
end_of_record

Linux環境でこれを実行したいと思います。

私の最初の試みは「sed」コマンドを使用してこれを行うことでしたが、いくつかの調査の結果、「awk」が複数行の操作を行うためのより適切なツールであるように見えました。

awkとRegexを使用して、これは私がこれまでに持っているコマンドです:

awk '/SF[:\/a-zA-Z0-9]*test[\/A-Za-z0-9.,:\n]*end_of_record/ {print}' FS="\n" RS="" examplefile

examplefileただし、最初の行に「test」が含まれているブロックだけでなく、完全なものが出力されます。awk正規表現が間違っているのか、電話で何かが足りないのかわかりません。

最初の行に「test」が含まれるブロックのみを取得するにはどうすればよいですか?

4

2 に答える 2

3

フラグが必要です:

awk '/^SF.*test.*/{f=1}f;/end_of_record/{f=0}' yourFile
于 2012-09-12T14:30:59.360 に答える
1
awk '{if($0~/SF:.*\/test\//){P=1;}if($0~/end_of_record/&& P==1){print;P=0;}if(P==1)print}' your_file
于 2012-09-12T13:48:20.563 に答える