Bash删除包含“/”的两个模式之间的行[重复]

Posted

技术标签:

【中文标题】Bash删除包含“/”的两个模式之间的行[重复]【英文标题】:Bash delete line beetwen two pattern containing "/" [duplicate] 【发布时间】: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被删除了 【参考方案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#

【讨论】:

谢谢你的答案。我没有问好问题,所以我编辑了第一篇文章。

以上是关于Bash删除包含“/”的两个模式之间的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从bash中的多个文件名中删除公共前缀模式[重复]

替换/删除 Bash 中其他两行之间的行

Bash脚本从.txt文件中删除特定行[重复]

如何复制或删除bash中的特定行并将它们创建到新文件中[重复]

VBA比较两个列表并删除不同列中具有重复值的行

如何选择可能使用 awk/sed 多次出现的两个标记模式之间的行