文件包含以下行:
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>
答案 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
:打印图案空间