使用sed或awk从xml文件中删除节点

使用sed或awk从xml文件中删除节点,awk,sed,Awk,Sed,我希望使用sed或awk实用程序从多个类似的XML文件中删除“error\u mail”和“success\u mail”节点 使用sed时,我尝试使用下面的命令..但它不起作用 sed -i /<action name="succeed_mail">/,/<\/action>/d *.xml sed-i//、//d*.xml 下面是示例文件(test.xml),如下所示:- 输入XML文件:-test.XML <workflow>

我希望使用sed或awk实用程序从多个类似的XML文件中删除“error\u mail”和“success\u mail”节点

使用sed时,我尝试使用下面的命令..但它不起作用

sed -i /<action name="succeed_mail">/,/<\/action>/d *.xml
sed-i//、//d*.xml
下面是示例文件(test.xml),如下所示:-

输入XML文件:-test.XML

 <workflow>
    <action name="start"
    -----
    -----
       </action>
    
    <action name="error_mail">
            <email xmlns="uri:oozie:email-action:0.1">
              <to>abc@xyz.com</to>
              <cc>abc@xyz.com</cc>
              <subject>Batch Failed</subject>
              <body>Batch Failed at ${node}</body>
            </email>
            <ok to="killjob"/>
            <error to="killjob"/>
          </action>
        <action name="succeed_mail">
            <email xmlns="uri:oozie:email-action:0.1">
              <to>abc@xyz.com</to>
              <cc>abc@xyz.com</cc>
              <subject>Batch Succeed</subject>
              <body>Batch completed</body>
            </email>
            <ok to="end"/>
            <error to="end"/>
          </action></r>
    </workflow>


专家们总是建议使用xmlstarlet之类的工具来解析xml文件,因为OP使用的是sed,所以提出了这个
awk
解决方案。公平警告这是根据显示的样本写的,如果你有不同的东西,这可能不起作用

awk '
/^ +<\/action>/ && foundSuccess{
  foundSuccess=""
  next
}
/^ +<\/action>/ && foundError{
  foundError=""
  next
}
/^ +<action name="error_mail">$/{
  foundError=1
}
/^ +<action name="succeed_mail">/{
  foundSuccess=1
}
NF && !foundError && !foundSuccess
' Input_file
awk'
/^+/&foundSuccess{
foundSuccess=“”
下一个
}
/^+/&&foundError{
foundError=“”
下一个
}

/^+

专家总是建议使用xmlstarlet之类的工具来解析xml文件,因为OP使用的是sed,所以提出了这个
awk
解决方案。公平警告这是根据显示的样本写的,如果你有不同的东西,这可能不起作用

awk '
/^ +<\/action>/ && foundSuccess{
  foundSuccess=""
  next
}
/^ +<\/action>/ && foundError{
  foundError=""
  next
}
/^ +<action name="error_mail">$/{
  foundError=1
}
/^ +<action name="succeed_mail">/{
  foundSuccess=1
}
NF && !foundError && !foundSuccess
' Input_file
awk'
/^+/&foundSuccess{
foundSuccess=“”
下一个
}
/^+/&&foundError{
foundError=“”
下一个
}

/^+

您没有告诉我们“它不工作”的方式,所以我假设您不知道如何在regexp中使用
,或者不知道必须引用脚本

使用具有
-E
以启用ERE的sed:

$ sed -E '/<action name="(succeed|error)_mail">/,/<\/action>/d' file
 <workflow>
    <action name="start"
    -----
    -----
       </action>

    </workflow>
$sed-E'//,///d'文件

您没有告诉我们“它不起作用”的方式,所以我假设您不知道如何在regexp中使用
,或者不知道必须引用脚本

使用具有
-E
以启用ERE的sed:

$ sed -E '/<action name="(succeed|error)_mail">/,/<\/action>/d' file
 <workflow>
    <action name="start"
    -----
    -----
       </action>

    </workflow>
$sed-E'//,///d'文件

谢谢@RavinderSingh13!它抛出下面的错误。awk-i in place'>/^+/&&foundSuccess{>foundSuccess=”“>next>>/^+/&&foundError{>foundError=“”>next>}>/^+$/{>foundError=1>}>/^+/{>foundSuccess=1>>NF&!发现错误&!foundSuccess>'redraw\u workflow\u curve2.xml用法:awk[POSIX或GNU样式选项]-f progfile[--]文件。。。用法:awk[POSIX或GNU样式选项][-]“程序”文件…@PraveenKumar,当我检查单个文件时,它工作得非常好。由于您的评论错误不清楚,请将其复制/粘贴清楚,并尝试在单个文件上测试一次,然后让我知道。@PraveenKumar在您的评论中脚本的每行开头的
是做什么的?@PraveenKumar,你好,Praveen,请检查我和Ed先生的答案,告诉我们进展如何?谢谢@RavinderSingh13!它抛出下面的错误。awk-i in place'>/^+/&&foundSuccess{>foundSuccess=”“>next>>/^+/&&foundError{>foundError=“”>next>}>/^+$/{>foundError=1>}>/^+/{>foundSuccess=1>>NF&!发现错误&!foundSuccess>'redraw\u workflow\u curve2.xml用法:awk[POSIX或GNU样式选项]-f progfile[--]文件。。。用法:awk[POSIX或GNU样式选项][-]“程序”文件…@PraveenKumar,当我检查单个文件时,它工作得非常好。由于您的评论错误不清楚,请将其复制/粘贴清楚,并尝试在单个文件上测试一次,然后让我知道。@PraveenKumar在您的评论中脚本的每行开头的
是做什么的?@PraveenKumar,你好,Praveen,请检查我和Ed sir的答案,并告诉我们进展如何?请始终将脚本用引号括起来:
sed'foo'
,而不是
sed foo
。此外,“它不工作”是最糟糕的问题陈述-告诉我们它不工作的方式(错误输出、无输出、错误消息等),这样我们就可以最好地帮助您解决您遇到的问题,而不是我们认为您可能遇到的其他问题。请始终将脚本括在引号中:
sed'foo'
,而不是
sed foo
。此外,“它不工作”是最糟糕的问题陈述-告诉我们它不工作的方式(错误输出、无输出、错误消息等),这样我们就可以最好地帮助您解决问题,而不是我们认为您可能遇到的其他问题。
$ awk '/<action name="(succeed|error)_mail">/{f=1} !f; /<\/action>/{f=0}' file
 <workflow>
    <action name="start"
    -----
    -----
       </action>

    </workflow>