如何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
忽略输入中不匹配的行。那么我们该怎么做呢?