有sed忽略不匹配的行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有sed忽略不匹配的行相关的知识,希望对你有一定的参考价值。

如何根据某些表达式使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的另一种方式:

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

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

不需要perl或grep。

(根据Nicholas Riley的建议编辑)

另一答案

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

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

这给出了:

-n
另一答案

使用Perl:

p

以上是关于有sed忽略不匹配的行的主要内容,如果未能解决你的问题,请参考以下文章

linux学习--grep与sed

匹配单词忽略sed中带有额外字符的相同单词

linux-grep awk sed

LINUX 三剑客老二(Sed) 日常工作总结

三个支持正则表达式的行处理的工具: grep/sed/awk

sed进阶教程