【发布时间】:2010-12-12 12:58:28
【问题描述】:
如何使sed 根据某些表达式过滤匹配行,但忽略不匹配的行,而不是让它们打印?
作为一个真实的例子,我想在一组文件上运行scalac(Scala 编译器),并从其-verbose 输出中读取创建的.class 文件。 scalac -verbose 输出一堆消息,但我们只对[wrote some-class-name.class] 形式的消息感兴趣。
我目前正在做的是(|& 是 bash 4.0 将 stderr 传递到下一个程序的方式):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
这将从我们感兴趣的消息中提取文件名,但也会让所有其他消息原封不动地通过!当然我们可以这样做:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
这很有效,但看起来很像解决真正的问题,即如何指示sed 忽略输入中的不匹配行。那么我们该怎么做呢?
【问题讨论】:
-
接受的答案应该是 mouviciel 的答案:stackoverflow.com/a/1665574/869951
标签: sed