我已经尝试了很多方法来解决这个问题但是我没有想法。希望有人可以指出我做错了什么。
以下是我的意见:
<Root>
<A>Keep</A>
<B>Keep</B>
<B>Remove</B>
<B>Keep</B>
<C>Keep</C>
</Root>
你现在可以搞清楚,我只想删除第4行:
<Root>
<A>Keep</A>
<B>Keep</B>
<B>Keep</B>
<C>Keep</C>
</Root>
到目前为止,这是我所拥有的,但它并没有按预期工作:
sed -e '3,${g;s/<B>.*<\/B>//p}' t1
我尝试添加我发现的组逻辑的一部分,但它不起作用,因为似乎sed没有让它贪婪的直接方法。
有什么想法吗?
答案 0 :(得分:3)
希望有人可以指出我做错了什么
正确的方法是使用XML / HTML解析器,例如 xmlstarlet
或 xmllint
:
xmlstarlet ed -O -d "//Root/*[3]" input.xml
ed
- 编辑模式-O
- 省略XML声明(<?xml ...?>)
-d
- 删除操作"//Root/*[3]"
- xpath 表达式选择父节点的第3个子节点Root
输出:
<Root>
<A>Keep</A>
<B>Keep</B>
<B>Keep</B>
<C>Keep</C>
</Root>