有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)\]$/'