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删除包含“/”的两个模式之间的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章