sed编辑,删除xml标签

时间:2016-01-25 10:57:29

标签: xml bash sed

我是一个名叫sed的伟大编辑的新手。

我想删除所有xml标记并在特定标记之间提取字符串 - reportBody

这里看起来像是一行:

<?xml version="1.0" ?><SOAP- ENV:Envelope xmlns:SOAP-ENV="blablah"><SOAP-ENV:Body> <getReportResponsexmlns:msgns="blahblahblah" xmlns="blahblah"><returnxmlns=""> <returnCode><majorReturnCode>000</majorReturnCode><minorReturnCode>0000</minorReturnCode><returnCode><reportName>blahblah</reportName><reportTitle>blahblahblahr</reportTitle><reportBody>STRING TO EXTRACT</reportBody><reportMimeType>text/csv</reportMimeType></return></getReportResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

问题是xml文件可能不同,有时它用一行写成2-3行或者要提取的字符串将存储在reportBody标记之间的多行上。所以它可能是那样的甚至是不同的:

    <?xml version="1.0" ?><SOAP- ENV:Envelope xmlns:SOAP-ENV="blablah"><SOAP-ENV:Body> 
`enter code here`<getReportResponsexmlns:msgns="blahblahblah" xmlns="blahblah">
<returnxmlns=""> <returnCode>
<majorReturnCode>000</majorReturnCode><minorReturnCode>0000</minorReturnCode>
<returnCode>
<reportName>blahblah</reportName><reportTitle>blahblahblahr</reportTitle><reportBody>
STRING 
TO 
EXTRACT</reportBody>
<reportMimeType>text/csv</reportMimeType></return>
</getReportResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

处理所有可能的变化的解决方案是什么? 另外,我可以设置参数来保存文件并将字符串解码为base64吗?谢谢!

1 个答案:

答案 0 :(得分:1)

你可以使用这个gnu-awk来提取它:

awk -v RS='<reportBody>.*</reportBody>' 'RT{print RT}' file.xml
<reportBody>
STRING
TO
EXTRACT</reportBody>

使用第一个输入,您将获得此输出:

<reportBody>STRING TO EXTRACT</reportBody>

-v RS='<reportBody>.*</reportBody>'会将输入记录分隔符设置为<reportBody></reportBody>

中的任何文字

使用:

awk -v RS='<reportBody>.*</reportBody>' 'RT{
     gsub(/<\/?reportBody>[[:space:]]*/, "", RT); print RT}' file.xml

如果要在标签内提取字符串。