有sed忽略不匹配的行
如何根据expression式使sedfilter匹配行,而忽略不匹配的行,而不是让它们打印?
作为一个实例,我想在一组文件上运行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)\]$/'