如何使 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
忽略来自输入的不匹配行。那我们要怎么做?