这是我的示例文本文件:
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;”的第二个标签正则表达式中的符号失败。不知道我哪里出错了?
知道怎么做吗?
答案 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