使用sed选择行

时间:2015-05-19 07:32:17

标签: regex sed

我有一个文本文件如下:

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行)停止。

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

如果没有测试,我认为您想要做的是省略第二个术语:

sed -rn '/[0-9]{4}-[0-9]{2}-[0-9]{2} 10:/ p' test.dat

在您的示例中,第二个术语将“包含”与其匹配的行。您只想打印匹配的行,而不是行之间的行。

基本上它只是grep

编辑抱歉,我刚刚意识到你要做的就是包含之后的下一行。你的正则表达式很好,除了“[^10]:”“匹配任何不是10的值”。

你可以放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'