我有一个问题:我希望能够删除文件中两个模式的行。
例如,能够删除等于"第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。
答案 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}}。