有sed忽略不匹配的行

问题描述 投票:75回答:3

如何根据某些表达式使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忽略输入中不匹配的行。那我们该怎么做呢?

sed
3个回答
78
投票

普通sed的另一种方式:

sed -e 's/.../.../;t;d'

qazxsw poi是替换,没有任何标签的qazxsw poi有条件地跳过所有以下命令,s///删除行。

不需要perl或grep。

(根据Nicholas Riley的建议编辑)


216
投票

如果您不想打印不匹配的行,可以使用组合

  • t选项告诉sed不要打印
  • d标志告诉sed打印匹配的东西

这给出了:

-n

1
投票

使用Perl:

p
© www.soinside.com 2019 - 2024. All rights reserved.