2013-07-30 61 views
3

我有以下文件內容。忽略sed的最後一行

2013-07-30 debug 
line1 
2013-07-30 info 
line2 
line3 
2013-07-30 debug 
line4 
line5 

我想下面的輸出與sed

2013-07-30 info 
line2 
line3 

這個命令讓我幾乎輸出我想

sed -n '/info/I,/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/{p}' myfile.txt 
2013-07-30 info 
line2 
line3 
2013-07-30 debug 

我怎麼在這裏省略了最後一行?

+0

'awk'? 'awk'/^[0-9] {4}( - [0-9] {2}){2}/{level = $ 2} level ==「debug」 – Kevin

回答

2

嘗試:

sed -n '/info/I p; //,/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/{ //! p}' myfile.txt 

它打印第一匹配,並且在範圍內省略了兩個邊緣,但第一個已經被印刷,因此僅跳過該第二個。它產生:

2013-07-30 info 
line2 
line3 
4

IMO,sed開始變得笨拙,只要你必須添加條件。我意識到你沒有用來標記問題,但這裏是一個只打印「信息」部分的awk程序。

awk -v type="info" ' 
    $1 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/ {p = ($2 == type)} 
    p 
' myfile.txt 
2013-07-30 info 
line2 
line3 
2

這可能爲你工作(GNU SED):

sed -r '/info/I{:a;n;/^[0-9]{4}(-[0-9]{2}){2}/!ba;s/^/\n/;D};d' file 

或者如果你喜歡:

sed '/info/I{:a;n;/^....-..-.. /!ba;s/^/\n/;D};d' file 

注:這適用於連續模式