用sed省略最后一行

时间:2013-07-30 15:41:35

标签: bash 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

如何省略最后一行?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

尝试:

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

它打印第一个匹配,并且在范围内省略了两个边但第一个已经打印,因此只跳过第二个。它产生:

2013-07-30 info
line2
line3

答案 2 :(得分: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

N.B。这适合连续模式