【问题标题】:sed delete lines not containing specific stringsed 删除不包含特定字符串的行
【发布时间】:2012-03-21 11:05:30
【问题描述】:

我是sed 的新手,我有以下问题。在这个例子中:

some text here
blah blah 123
another new line
some other text as well
another line

我想删除除包含字符串'text' and 或字符串'blah' 之外的所有行,所以我的输出文件如下所示:

some text here
blah blah 123
some other text as well

任何提示如何使用sed 完成此操作?

【问题讨论】:

标签: sed


【解决方案1】:

这可能对你有用:

sed '/text\|blah/!d' file
some text here
blah blah 123
some other text as well

【讨论】:

  • 我怎样才能指定 text 或 blah 只能出现在最后一列?
  • @lovedynasty 如果你的意思是在行尾,你应该使用$:'/text$\|blah$/!d'
  • @potong 如果我将分隔符 char / 替换为 #,这将不起作用,知道为什么吗?
  • @burglarhobbit 我想你的意思是正则表达式分隔符/。这可以设置为替换命令中的任何分隔符,例如s#...#...# 但是,当用于匹配第一个分隔符时,必须引用例如将分隔符设置为 # 使用 \#match#d 删除匹配的行。
【解决方案2】:

您只想打印匹配“text”或“blah”(或两者)的行,其中“and”和“or”之间的区别非常重要。

sed -n -e '/text/{p;n;}' -e '/blah/{p;n;}' your_data_file

-n 表示默认不打印。第一个模式搜索“文本”,如果匹配则打印并跳到下一行;第二种模式对“blah”的作用相同。如果“n”不存在,则包含“text and blah”的行将被打印两次。虽然我可以只使用-e '/blah/p',但对称性更好,尤其是当您需要扩展匹配词列表时。

如果您的 sed 版本支持扩展正则表达式(例如,GNU sed 支持,-r),那么您可以将其简化为:

sed -r -n -e '/text|blah/p' your_data_file

【讨论】:

  • 如果 sed 不支持-r,它可能也不支持{}。这应该适用于较旧的 sed:sed '/text\|blah/!d' file
  • { ... } 命令分组在sed 的第 7 版 UNIX 版本中;我想不出你怎么会遇到不受支持的版本。
  • 我发现这更容易sed -n -e '/keep-this/p' -e '/keep-that/p' -e '/keep-those/p'。不需要复合命令。 “行将被打印两次”没有问题。此外,在我的情况下,在{p;n;} 中添加额外的命令n 将删除第一个表达式匹配。这可能是由于特定的输入字符串。但是这个答案确实帮助我找到了寻找的地方!
  • @JamesThomasMoon1979 — 小心包含"keep-this" he said, and "keep-that", not to mention "keep-those" 的行。您的版本将打印该行 3 次;我的只有一次。这取决于您需要的输出。如果您想将单行打印三遍,您的解决方案就很好。如果没有,那么它还有一些不足之处。
  • 很好的反馈。在我的例子中,我遇到了这个错误场景:假设我想打印两个输入行a 和a b,下面的命令只打印第一个输入行echo -e 'a\na b' | sed -n -e '/b/{p;n;}' -e '/a/{p;n;}'。但是如果我改变表达式的顺序,该命令将打印两个输入行echo -e 'a\na b' | sed -n -e '/a/{p;n;}' -e '/b/{p;n;}'。
【解决方案3】:

你可以简单地通过 awk 来做,

$ awk '/blah|text/' file
some text here
blah blah 123
some other text as well

【讨论】:

    【解决方案4】:

    您在寻找grep 吗? 这是一个查找不同文本的示例。

    cat yourfile.txt | grep "text\|blah"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2020-02-04
      相关资源
      最近更新 更多