我有以下文件内容。
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 :(得分:4)
IMO,一旦你必须添加条件,sed开始变得笨拙。我意识到你没有使用awk标记问题,但这是一个仅打印“信息”部分的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。这适合连续模式