【问题标题】:Extract sub string from XML tag with more than one line using awk/sed使用 awk/sed 从多行的 XML 标记中提取子字符串
【发布时间】:2016-06-01 11:38:46
【问题描述】:

我有一个 XML 文件,其中包含许多帐户标签,其中将包含很少的其他标签,包括 RecordNumber 和 OriginalData。我想比较该 XML 文件中的 2 个数字,一个来自 RecordNumber 标签,另一个来自 OriginalData——part_name 后正好是 6 个字符。理想情况下,这 2 个数字应该相等,但在某些 xml 标签的某些文件中它们是不同的。

使用 awk 或 sed 会很棒???

这是我的 XML 文件的示例。

....
<Account>
.......
<RecordNumber>224</RecordNumber>
......
  <OriginalData><![CDATA[E0000003350000077558part_name              89947                                         0123456789012345                                            C2016-01-08T13:04:41-05:00001004000000000000000035.000000000000000000035.000                      US034F93Geg824G36L8F                                                                                               0002                                                                                                                                                                                 
.....

……

感谢您的帮助。

【问题讨论】:

  • 224 RecordNumber> 帐户>
  • 对不起,这是我第一次添加代码,所以无法清楚地添加,抱歉格式不好。
  • 尝试先发布您已经完成的代码。阅读stackoverflow.com/help/formatting 以了解您的问题的格式,并阅读stackoverflow.com/help/mcve 以了解如何提问。
  • 我在这里有另一个建议:不要使用 sed/awk 处理 xml 文件,尝试使用 xml 库作为您最喜欢的编程语言(如果您有大量数据则使用流式传输)或使用 xml 处理工具像 xmlstartlet。
  • 那是 xmlstarlet。 (这有点令人吃惊。)

标签: xml shell unix awk sed


【解决方案1】:
 cat file.xml | sed -e "s/^.*RecordNumber>\([0-9]*\)<\/RecordNumber.*part_name *\([0-9]*\) *.*$/RecordNumber=\1\npart_name=\2/g"

【讨论】:

  • 任何纯代码的答案都会是一个更好的答案,并解释它为什么以及如何工作。此外,这里不需要cat - sed 将文件名作为参数。
【解决方案2】:

这是一个相当长的 shell 脚本。它会将 RecordNumber 和 part_name 编号捕获到不同的文件中。然后它使用diff 来查找不同的号码。如果有任何差异,您将在您的 xml 文件中查找此编号。

cat FILE.xml | 
sed -zr ' 
        # normalize xml, insert newlines for RecordNumber and part_name
        s#</?RecordNumber>#\n&\n#g ; 
        s/part_name.{6}/\n&\n/g ;  
 ' | 
 sed -rn '
         # write the numbers into different files
        /<RecordNumber>/,/<\/RecordNumber>/ { 
                /[0-9]+/ { w rval.txt
                p;
                } 
        }
        /part_name/ {
                s/part_name[ ]+//g;
                w pval.txt
                p;
        }
 '
# compare the numbers
diff rval.txt pval.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2013-04-09
    相关资源
    最近更新 更多