3

我有以下文件内容。

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

我如何在这里省略最后一行?

4

3 回答 3

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
于 2013-07-30T16:03:17.247 回答
2

尝试:

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

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

2013-07-30 info
line2
line3
于 2013-07-30T15:51:54.483 回答
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

NB 这迎合连续模式

于 2013-07-30T20:08:41.617 回答