2013-07-30 60 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 

注:这适用于连续模式