我有一个 xml 文件 emp.xml
<?xml>
<employee name="abc">ABC</employee>
<employee name="def">DEF</employee>
<!-- abc@gmail.com
this comment is added
to <employee name="gh">
</employee>
-->
?>
我想从此文件中删除一些员工详细信息。其他文件 delemp.txt 中提到了要删除的员工详细信息 美国广播公司 高
while read line
do
i=\"$line\"
echo $i
find . -name "emp.xml" -type f | xargs sed -i -e '/employee name='$i'/,/<\/employee>/d'
done < delemp.txt
我正在阅读 delemp.txt 并获取要删除的员工详细信息并搜索员工姓名 = 和员工结束标记,但此代码不起作用
即使我尝试
sed -i '/employee name=\"abc\"/,/<\/employee>/d' emp.xml
它正在删除前两行,即 name="abc"和 "def"
最佳答案
更正 xml 使其有效
<?xml version="1.0" encoding="UTF-8"?>
<root>
<employee name="abc">ABC</employee>
<employee name="def">DEF</employee>
<!-- abc@gmail.com
this comment is added
to <employee name="gh">
</employee>
-->
</root>
使用xmlstarlet和一个合适的 xpath删除 XML 节点的表达式
xmlstarlet ed -L -d '/root/employee[@name="abc"]' file.xml
结果
<?xml version=xmlstarlet ed -L -d '/root/employee[@name="abc"]' file.xml"1.0" encoding="UTF-8"?>
<root>
<employee name="def">DEF</employee>
<!-- abc@gmail.com
this comment is added
to <employee name="gh">
</employee>
-->
</root>
最后:
while read name; do
xmlstarlet ed -L -d "/root/employee[@name='$name']" file.xml
done < names.txt
关于xml - 提到开始和结束模式时,sed 正在删除多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55500658/