如何仅删除模式的第一组?

时间:2017-12-01 15:47:44

标签: bash unix sed

我已经尝试了很多方法来解决这个问题但是我没有想法。希望有人可以指出我做错了什么。

以下是我的意见:

<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没有让它贪婪的直接方法。

有什么想法吗?

1 个答案:

答案 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>