Bash删除行beetwen两个模式包含" /"

时间:2016-07-28 12:15:02

标签: bash sed

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

例如,能够删除等于"第1行和第34行的行; 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。

3 个答案:

答案 0 :(得分:2)

你做了一个糟糕的例子,因为你的sed cmd适用于两个输入文件。我想你想要一个包含/和sed。

的模式

如果你想与文字/匹配,你可以逃避那些/,但是,它使代码不那么容易阅读,特别是你有很多/个想要匹配,你可以使用\[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//@是模式匹配部分。

答案 1 :(得分:1)

您可以转义/中的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跳过打印行,以便考虑下一行。

答案 2 :(得分:0)

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