【问题标题】:Multiple pattern matches in a single sed command单个 sed 命令中的多个模式匹配
【发布时间】:2020-04-27 06:25:49
【问题描述】:

假设我有这个字符串,

asdfd ERROR [asdfa:11] (12312) [asdfiel-asdf-asdf] some random text

并且我想删除括号内的文本 ((…)) 和方括号内的文本的第二次出现 ([…]),以便输出将是

asdfd ERROR [asdfa:11] some random text

如何在不使用管道运算符和单个 sed 命令的情况下执行此操作?

【问题讨论】:

  • 如何使用管道运算符或多个 sed 命令执行此操作?
  • 您提供的唯一输入样本过于具体。如果)[ 之间有空格怎么办?你想保存它吗?我在回答中做出了这个假设,但是您应该通过提供一些更相关的输入/输出对来提供对预期输出的更准确描述。标记为需要详细信息
  • 您的输入数据中是否可以使用嵌套括号和方括号?如果是,像something wrong (ERROR[asdfa:11]) 这样的输入的期望输出是什么?删除括号中的内容也会洗掉第一个括号内的子字符串。换句话说,这种情况下的问题要求是自相矛盾的。

标签: sed


【解决方案1】:

在您提到的特定情况下,无需运行两个命令。你可以这样做

sed 's/(.*] //' yourfile

(注意这里不需要转义]。)显然,这将从该行的第一个左括号删除到它之后的最后一个右方括号(如果有,则可能不是第二个)第二个之后的其他[…] 组)。

另一种更准确的方法可能是这样,

sed 's/([^)]*) *\([^[]*\) *\[[^]]*\] /\1/' yourfile

其中([^)]*) 匹配第一个(…) 组,\([^[]*\) 匹配并捕获以下零个或多个非[ 序列,\[[^]]*\] 匹配其后的第一个[…] 组。 (两个* 和最后一个 是为了去掉) 之后和[ 之前的所有空格,如果需要可以调整。)

【讨论】: