【问题标题】:Bash delete line beetwen two pattern containing "/" [duplicate]Bash删除包含“/”的两个模式之间的行[重复]
【发布时间】:2016-12-02 19:52:14
【问题描述】:

我有一个问题:我希望能够删除文件中两个模式之间的行。

例如可以删除等于“line 1”beetwin“blablabla++”和“blablabla--”的行

line1
blablabla++
line1
line2
line3
blablabla--
line1

我找到了一种使用 sed 的方法:

sed '/blablabla++/,/blablabla--/{/line1/d}' ./file

效果很好。但问题是,在我的真实文件中更像是:

line1/script
blablabla++
line1/script
line2/script
line3/script
blablabla--
line1/script

我怎么能这样做?

编辑

我选择了一个不好的例子。

问题是我不知道我需要删除的行是什么(该行将作为参数发送)。但我肯定知道一件事是它们将包含“/”字符。

问题是当我这样做时:

sed '/blablabla++/,/blablabla--/{/$1/d}' ./file

$1 包含的“/”会弄乱我的 sed。

【问题讨论】:

  • 成功了,第二个line1/script被删除了

标签: bash sed


【解决方案1】:

您做了一个不好的例子,因为您的 sed cmd 可以同时使用两个输入文件。我猜你想用 sed 匹配一个包含 / 的模式。

如果你想匹配文字/的东西,你可以转义那些/s,但是,它使代码不那么容易阅读,特别是你有很多/s想要匹配,你可以在这里使用\[c]pattern[c] [c] 可以是任何字符。例如:

kent$  cat f
//one//
blablabla++
//one//
//one two//
//one three//
blablabla--
//one//

kent$  sed '/blablabla++/,/blablabla--/{\@//one//@d}' f
//one//
blablabla++
//one two//
//one three//
blablabla--
//one//

在上面的例子中,\@//one//@ 是模式匹配部分。

【讨论】:

  • 谢谢你的答案。我没有问好问题,所以我编辑了第一篇文章。
【解决方案2】:

您可以转义line1/script 中的/ 字符,如下所示:-

$ sed '/blablabla++/,/blablabla--/{/line1\/script/d}' file
line1/script
blablabla++
line2/script
line3/script
blablabla--
line1/script

或者可能使用 -i 标志对存储的备份进行就地编辑。

awk 的另一种可能解决方案

$ awk '/blablabla++/,/blablabla--/{if ($0 ~ /line1\/script/) next }1' file
line1/script
blablabla++
line2/script
line3/script
blablabla--
line1/script

使用awk 解决方案的诀窍是,只要符合$0 ~ /line1\/script/ 模式,我们就会跳过使用next 打印的行,以便考虑下一行。

【讨论】:

  • 谢谢你的答案。我没有问好问题,所以我编辑了第一篇文章。
【解决方案3】:

要在sed 正则表达式中包含反斜杠,您可以转义它们,如/line1\/script/,或为正则表达式分隔符使用不同的字符,如#line1/script#

【讨论】:

  • 谢谢你的答案。我没有问好问题,所以我编辑了第一篇文章。
猜你喜欢
  • 1970-01-01
  • 2021-10-15
  • 2020-06-12
  • 2021-09-16
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多