如何删除具有特定字符串的所有行但不删除同一文件的特定部分中包含相同字符串的行

时间:2015-12-08 12:56:01

标签: linux unix sed pattern-matching text-processing

文件包含以下行:

UserName aashii
UserName drisha
UserName aashii
UserName harsha
UserName sampada
<Anonymous>
UserName drisha
UserName aashii
</Anonymous>

我想从unix中的文件中删除包含字符串"UserName aashii"的行,而不删除"UserName aashii"部分下包含字符串<Anonymous>....</Anonymous>的行。

我尝试了命令:

sed -i '/^ *UserName *aashii *$/d' -i $file

但它删除所有包含字符串的行甚至是<Anonymous>.....</Anonymous>

部分下面的字符串的行

2 个答案:

答案 0 :(得分:3)

你可以说:

awk '/<Anonymous>/,/<\/Anonymous>/ {print;next} !/UserName aashii/' file

返回:

UserName drisha
UserName harsha
UserName sampada
<Anonymous>
UserName drisha
UserName aashii
</Anonymous>

也就是说,如果它是range expression的一部分或不包含"UserName aashii",则打印。

答案 1 :(得分:-1)

使用GNU sed:

sed -n '/<Anonymous>/,/<\/Anonymous>/{p;b};/UserName aashii/d;p' file

输出:

UserName drisha
UserName harsha
UserName sampada
<Anonymous>
UserName drisha
UserName aashii
</Anonymous>
  

-n:禁止自动打印图案空间

     

/<Anonymous>/,/<\/Anonymous>/{p;b}:在匹配行<Anonymous></Anonymous>打印模式空间(p)的完整范围内,然后跳转到脚本末尾(b )(不再进一步处理其他命令)。

     

/UserName aashii/d:对于匹配UserName aashii的行删除模式空间(d)并开始下一个周期(不再进一步处理其他命令)。

     

p:打印图案空间