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

Bash 如何仅删除模式的第一组?,bash,unix,sed,Bash,Unix,Sed,我已经尝试了很多方法来解决这个问题,但是我已经没有主意了。希望有人能指出我做错了什么 以下是我的意见: <Root> <A>Keep</A> <B>Keep</B> <B>Remove</B> <B>Keep</B> <C>Keep</C> </Root> 保持 保持 去除 保持 保持 正如你们现在已经知道的

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

以下是我的意见:

<Root>
    <A>Keep</A>
    <B>Keep</B>
    <B>Remove</B>
    <B>Keep</B>
    <C>Keep</C>
</Root>

保持
保持
去除
保持
保持
正如你们现在已经知道的,我只是想删除第4行:


保持
保持
保持
保持
以下是我到目前为止所做的,但它并没有完全按照预期工作:

sed -e '3,${g;s/<B>.*<\/B>//p}' t1
sed-e'3,${g;s/*//p}'t1
我试着加入我发现的团队逻辑的一部分,但它不起作用,因为sed似乎没有直接的方法让它变得贪婪

有什么想法吗

希望有人能指出我做错了什么

正确的方法是使用XML/HTML解析器,如
xmlstarlet
xmllint

xmlstarlet ed -O -d "//Root/*[3]" input.xml
  • ed
    -编辑模式
  • -O
    -省略XML声明
    ()
  • -d
    -删除操作
  • “//Root/*[3]”
    -选择父节点的第三个子节点的xpath表达式
    Root

输出:

<Root>
  <A>Keep</A>
  <B>Keep</B>
  <B>Keep</B>
  <C>Keep</C>
</Root>

保持
保持
保持
保持

1。在对事物的传统理解中,sed是贪婪的。2.为什么不干脆
sed'/Remove/d't1
?3.使用
3,$
似乎是个骗局:如果是这样,那么为什么不使用
sed-n'4t1
?4.如果您注册ex
/s/../
甚至没有提到
删除
,那么在
删除
行之后可以有一行
吗?或者你没有真正告诉我们关于你的问题的所有重要信息;-)祝你好运
<Root>
  <A>Keep</A>
  <B>Keep</B>
  <B>Keep</B>
  <C>Keep</C>
</Root>