我有一个文本文件如下:
2015-05-08 09:02 Out.dat
2015-05-08 10:45:22.617 ERROR EventLog
2015-05-08 10:02 Out.xml
2015-05-08 11:30 Out.html
2015-05-08 05:30 Out.ps
我正在尝试选择包含上午10点的行,直到它到达任何不是上午10点的行为。所以我使用下面的sed
命令:
sed -rn '/[0-9]{4}-[0-9]{2}-[0-9]{2} 10:/ , /[0-9]{4}-[0-9]{2}-[0-9]{2} [^10]:/ p' test.dat
输出是:
2015-05-08 10:45:22.617 ERROR EventLog
2015-05-08 10:02 Out.xml
2015-05-08 11:30 Out.html
2015-05-08 05:30 Out.ps
我不希望最后一行到来。它应该在11:30线(输出的第3行)停止。
有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
如果没有测试,我认为您想要做的是省略第二个术语:
sed -rn '/[0-9]{4}-[0-9]{2}-[0-9]{2} 10:/ p' test.dat
在您的示例中,第二个术语将“包含”与其匹配的行。您只想打印做匹配的行,而不是行之间的行。
基本上它只是grep
。
编辑抱歉,我刚刚意识到你要做的就是包含之后的下一行。你的正则表达式很好,除了“[^10]:
”“匹配任何不是1
或0
的值”。
你可以放1[^0]
..
$ sed -rn '/[0-9]{4}-[0-9]{2}-[0-9]{2} 10:/ , /[0-9]{4}-[0-9]{2}-[0-9]{2} 1[^0]:/ P' test.txt
2015-05-08 10:45:22.617 ERROR EventLog
2015-05-08 10:02 Out.xml
2015-05-08 11:30 Out.html
答案 1 :(得分:1)
sed '/^[0-9-]* 10:/ !d' YourFile
10:
的所有行
-i
进行内联编辑(在这种情况下不是流式传输)答案 2 :(得分:0)
[^10]:
匹配任何非1或0的内容,即单个字符,后跟:
,但您的数据中不存在此行。
在sed中很难实现否定。幸运的是,你不需要它:
sed -rn '/^[0-9]{4}-[0-9]{2}-[0-9]{2} 10:/ p'