15

这是我的示例文本文件:

阿斯达斯
//<<<标签
这应该被删除
//标签>>>
这应该在那里
//<<<标签
吨
>
asd
asd
//标签>>>

我希望 o/p 为:

阿斯达斯

这应该在那里

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

我尝试使用 sed

sed -n '1h;1!H;${;g;s///<<]*TAG>>>//g;p;}' < test.txt

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

知道怎么做吗?

4

3 回答 3

11

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

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

从您的评论来看,似乎 TAG 可能不是字面意思,在这种情况下:

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

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

sed '@^//<<<@,@^//.*>>>@d'
于 2009-08-03T11:07:04.447 回答
3

与其使用我提供的 sed 解决方案,不如使用 perl 和 awk 中的任何一个:

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

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

perl -ne '打印 if !( m@^//<<<(.*)@ .. m@^//$1>>>$@ )'
于 2009-08-03T16:05:01.623 回答
1

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

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

awk 版本匹配具有相同标签名称的结尾:

awk -F'//<<<|//|>>>' '$2{p=$2; while(getline && p!=$2); next}1' file
于 2013-03-08T15:43:24.633 回答