【问题标题】:sed edit, delete xml tagssed编辑,删除xml标签
【发布时间】:2016-01-25 19:10:53
【问题描述】:

我是新手,有个很棒的编辑器叫做 - 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标签之间的多于1行中。所以它可以是类似的,甚至是不同的:

    <?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吗?谢谢!

【问题讨论】:

  • 好主意,但是这个字符串可以包含比最大值更多的符号。字符串的值,所以xml解析器无法处理。
  • 很遗憾您问题中的 XML 无效 - 我怀疑这只是您为我们准备示例的结果。如果它是有效的,那么正如@123 所建议的那样,你真的应该使用像xmllint --xpath '//reportBody/text()' file.xml 这样的命令。
  • 它无效 :( 它来自一个 m2m 服务器,reportBody 内附有 base64 编码文件

标签: xml bash sed


【解决方案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='&lt;reportBody&gt;.*&lt;/reportBody&gt;' 将输入记录分隔符设置为从&lt;reportBody&gt;&lt;/reportBody&gt; 的任何文本

用途:

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

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

【讨论】:

  • 更新:看到你的旧消息,谢谢一百万!老:那么,awk 可以轻松提取“reportBody”标签之间的字符串(STRING TO EXTRACT)吗?字符串可以存储在多于 1 行或恰好存储在 1 行中是否重要?此外,整个 xml 不会与您看到的“reportName”和“reportTitle”标签相同,它们之间的字符串也不会相同。
  • 太棒了,将尝试使用完整文件(超过 10k 个符号),再次感谢您!
  • 不起作用 :( 输出文件为空,也许我做错了什么
  • 找到了 sed 的解决方案 适用于任何情况 ------ cat $1 | tr "\n" "|" | grep -o '.*' | sed 's/(\|)//g' | sed 's/|/\n/g' | sed '/^\s*$/d' > $2
  • 附上整个代码,一切都很好,再次感谢您! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多