使用sed或awk从xml文件中删除节点
我希望使用sed或awk实用程序从多个类似的XML文件中删除“error\u mail”和“success\u mail”节点 使用sed时,我尝试使用下面的命令..但它不起作用使用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 -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>