【问题标题】:SED: remove pattern from two specific lines [duplicate]SED:从两个特定行中删除模式[重复]
【发布时间】:2015-08-19 12:01:04
【问题描述】:

以下命令将从包含它的所有第 13、14、15...29 行中删除 PATTERN:

sed -i 13,29s/PATTERN// file

但是,我只想从第 13 行和第 29 行中删除 PATTERN。显然,我可以使用

sed -i 13s/PATTERN//;29s/PATTERN// file

但是我的模式足够长,因此不方便,所以我只想指定一次 PATTERN。有任何想法吗?我试图寻找答案,但一无所获。

另外,sed 使用逗号而不是破折号来匹配一系列行是否有正当理由?我觉得不合逻辑。

提前致谢。

【问题讨论】:

  • 将您的模式存储在一个变量中并重复该变量?
  • 太复杂了。我正在寻找更方便的东西。
  • 好吧,我也称它为方便...替代方案是 awk。 NR == 13 || NR == 29也很方便
  • 你能分享完整的命令吗?
  • 这实际上与this 是同一个问题,请注意您所要求的两个行号地址之间的“逻辑或”答案的难度。

标签: regex bash sed


【解决方案1】:

使用 awk:

awk 'NR == 13 || NR == 29 { sub(/PATTERN/, "") } { print }' file

当然,你必须在这里使用 awk compatible re。 https://www.gnu.org/software/gawk/manual/html_node/Regexp.html#Regexp

第一部分满足您的要求,第二部分只是打印所有内容。您可以使用重定向将内容放在另一个文件中,然后移动到原始位置。

【讨论】:

  • 正如你所说,这只会打印出删除了 PATTERN 的指定行。由于我的输入是一个文件,因此应该编写命令以反映这一点。此外,它比使用 sed 复杂得多。
  • @mYself 没有。它应该打印出修改了 13 和 29 行的文件的所有内容。并且传递到文件中就像显示的那样简单。您在寻找什么样的解决方案?
  • 也许您尝试了我的旧答案。现在在你的浏览器上试试这个。或先刷新以确认。
  • 您可能是对的,因为该命令现在将文件的全部内容减去 PATTERN 输出到标准输出。
  • 感谢您的贡献。
【解决方案2】:

好的,以下可能是最接近我的问题的答案:

sed -i '13,29{14,28!s/PATTERN//}' file

用逻辑或稍长的答案:

sed -i '13bA;29bA;b;:A;s/PATTERN//' file

另外,使用变量:

VAR=PATTERN
sed -i "13s/$VAR//;29s/$VAR//" file

感谢@Jeff Bowman for redirection 和@HuStmpHrrr 提供使用变量的建议。

【讨论】:

    最近更新 更多