有sed忽略不匹配的行
如何根据expression式使sed
filter匹配行,而忽略不匹配的行,而不是让它们打印?
作为一个实例,我想在一组文件上运行scalac
(Scala编译器),并从其-verbose
输出中读取创build的.class
文件。 scalac -verbose
输出一堆消息,但是我们只对那些forms感兴趣[wrote some-class-name.class]
。 我现在正在做的是( |&
bash 4.0的方式来pipe理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
忽略来自input的不匹配的行。 那么我们该怎么做呢?
用普通sed的另一种方法:
sed -e 's/.../.../;tx;d;:x'
s///
是一个替代,如果replace成功, tx
分支到标签x, d
删除行, :x
是标签x的标记。
不需要perl或grep。
如果不想打印不匹配的行,可以使用组合
-
-n
选项告诉sed不要打印 -
p
标志告诉sed打印什么匹配
这给了:
sed -n 's/.../.../p'
使用Perl:
... |& perl -ne 'print "$1\n" if /^\[wrote (.*\.class)\]$/'