在Bash脚本中使用sed删除含特殊字符的字符串报错求助
解决方法
你的问题核心有两点:一是sed命令中特殊字符(如/)的转义麻烦,二是需要删除<test>标签内的所有子行以得到期望输出。
1. 简化特殊字符处理
sed默认用/作为替换分隔符,当目标字符串包含/时需转义,更简便的方式是更换分隔符(比如|或#),彻底避免转义操作:
sed -i 's|<host1>Sometext</host1>||g' test.xml
但这个命令仅清空<host1>所在行的内容,不会删除整行,也无法处理<host2>的行,无法满足你的最终需求。
2. 实现期望输出的完整命令
要将<test>和</test>之间的所有子行完全删除,保留标签间的空行,使用sed的区间匹配+条件删除:
sed -i '/<test>/,/<\/test>/ { /<test>/!{ /<\/test>/!d; }; }' test.xml
命令说明:
/<test>/,/<\/test>/:匹配从<test>行到</test>行的内容区间/<test>/!{ /<\/test>/!d; }:仅保留<test>和</test>行,删除区间内的所有其他行
执行后,test.xml会生成你想要的输出:
<test> </test>
内容的提问来源于stack exchange,提问作者Vinayak Shettigar
相关产品推荐
相关产品推荐

