我是一个名叫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吗?谢谢!
答案 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
如果要在标签内提取字符串。