sed multiline替换

时间:2009-08-03 08:40:41

标签: sed multiline

这是我的示例文本文件:

asdas
//<<<TAG
this should be removed
//TAG>>>
this should be there
//<<<TAG
T
>
asd
asd
//TAG>>>

我希望o / p为:

asdas

this should be there

基本上我试图找到“//&lt;&lt;&gt;&gt;”之间的行(也包括这些行)并删除它们。

我尝试使用sed

  

sed -n   '1H;!1H; $ {;克; S&/// LT;&LT;] * TAG&GT;&GT;&GT; //克; P;}'   &LT;的test.txt

但有些怎么没有产生正确的输出。包含“&gt;”的第二个标签正则表达式中的符号失败。不知道我哪里出错了?

知道怎么做吗?

3 个答案:

答案 0 :(得分:10)

如果您尝试删除文字文字“TAG”的行,请尝试:

sed '/\/\/<<<TAG/,/\/\/TAG>>>/d'

根据您的评论,似乎TAG可能不是文字,在这种情况下:

sed '/^\/\/<</,/^\/\/.*>>/d'

这可以通过使用不同的分隔符来简化:

sed '@^//<<<@,@^//.*>>>@d'

答案 1 :(得分:3)

不是使用我给出的sed解决方案,你可能会喜欢perl和awk中的任何一个:

perl -ne 'print if !( m@//<<<TAG@ .. m@//TAG>>>@ )'
awk '/\/\/<<<TAG/,/\/\/TAG>>>/ {next} 1'

鉴于我认为你真的不希望TAG成为常数,我所知道的最干净的解决方案是perl变体:

perl -ne 'print if !( m@^//<<<(.*)@ .. m@^//$1>>>$@ )'

答案 2 :(得分:0)

此外,sed中的搜索分隔符可以通过转义第一个分隔符来更改:

sed '\|^//<<<|,\|^//.*>>>|d' file

Awk版本匹配具有相同标记名称的结尾:

awk -F'//<<<|//|>>>' '$2{p=$2; while(getline && p!=$2); next}1' file