【问题标题】:Delete lines that contain two strings删除包含两个字符串的行
【发布时间】:2015-02-18 08:19:00
【问题描述】:

我正在尝试使用sed 删除文本文件中的一些行。我只想删除包含两个字符串的行。命令\| 等效于布尔值OR。布尔运算符AND的命令是什么?

我正在寻找这样的东西:

sed '/strA'AND'strB/d' file.txt

【问题讨论】:

  • @tripleee 不是重复的,sed 使用 RegEx 实现的子部分
  • @NeronLeVelu 标记的副本足以为大多数正则表达式方言提供解决方案,但显然不是专门针对sed。如果你能找到更好的副本,请链接到它——这是一个非常常见的问题,我相信你能找到一个。

标签: file sed


【解决方案1】:
sed '/strA/{
        /strB/ d
        }' YourFile
  • AND 是一个子过滤器(如果过滤 strA,则过滤 strB 上的相同内容)
  • 顺序对于过滤本身并不重要,但可能会根据每个模式的出现来改变性能)

【讨论】:

    【解决方案2】:

    您可以使用相同的 \| OR (alternation) 运算符。下面的 sed 命令将删除所有同时具有 strA 和 strB 的行,无论顺序如何。

    sed '/strA.*strB\|strB.*strA/d' file.txt
    

    如果你想删除 strA 总是在 strB 之前的行,那么你可以使用它。

    sed '/strA.*strB/d' file.txt
    

    【讨论】:

    • 当您需要大量字符串的 AND 时,这会变得非常繁重。
    • 另外,/abc.*cba/ 与 abcba 不匹配,即使它应该匹配(可能不是在提问者的情况下)。
    【解决方案3】:

    这可能对你有用(GNU sed):

    sed '/strA/!b;/strB/d' file
    

    如果该行不包含strA,则退出。如果有并且还包含strB,则删除它。

    【讨论】:

      【解决方案4】:

      您不能在一个命令上放置两个选择器,但您可以在大括号之间放置一个命令并这样做:

      sed '/strA/{/strB/d}' file.txt
      

      不好的部分是,如果你有很多字符串要测试,你可能有很多{} 需要处理。此外,它可能效率不高。

      【讨论】:

        猜你喜欢
        • 2014-04-16
        • 1970-01-01
        • 2022-08-11
        • 2021-09-17
        • 2016-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多