2012-09-12 26 views
0

我有一個看起來像這樣的文件:AWK:顯示匹配正則表達式(多)

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)可能不同。我想打印所有在第一行中具有「測試」字符串的塊(如「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和正則表達式,這是我迄今爲止的命令:

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

但它輸出完整的examplefile,不僅包含「測試」中的第一行的塊。我不確定我的正則表達式是否錯誤,或者我是否在我的awk調用中丟失了某些東西。

我怎樣才能得到第一行中的「測試」塊?

回答

3

你需要一個標誌:

awk '/^SF.*test.*/{f=1}f;/end_of_record/{f=0}' yourFile 
1
awk '{if($0~/SF:.*\/test\//){P=1;}if($0~/end_of_record/&& P==1){print;P=0;}if(P==1)print}' your_file