题
这是我的示例文本文件:
asdas //<<<TAG this should be removed //TAG>>> this should be there //<<<TAG T > asd asd //TAG>>>
有关,我想O / P为:
asdas this should be there
基本上I M努力寻找之间 “// << >>” 线(包括这些线也行),并将其删除。
我试图使用的sed
SED -n '1H;!1H; $ {;克; S /// <<] * TAG >>> //克; P;}'
但它做了一些如何不产生正确的输出。其中载有第二个标签“>”符号的正则表达式失败。不知道在哪里我要去了?
任何想法,该怎么办呢?
解决方案
如果你想删除与文字文本“标签”行,请尝试:
sed '/\/\/<<<TAG/,/\/\/TAG>>>/d'
从你的意见,似乎TAG可以不是字面,在这种情况下:
sed '/^\/\/<</,/^\/\/.*>>/d'
这可以通过使用不同的分隔符被简化:
sed '@^//<<<@,@^//.*>>>@d'
其他提示
而不是使用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>>>$@ )'
在另外在sed
搜索定界符可通过逸出第一分隔符来改变:
sed '\|^//<<<|,\|^//.*>>>|d' file
awk中版本的匹配具有相同标签名的末尾:
awk -F'//<<<|//|>>>' '$2{p=$2; while(getline && p!=$2); next}1' file
不隶属于 StackOverflow