使用awk / sed从多个行的XML标记中提取子字符串

时间:2016-02-19 19:09:00

标签: xml shell unix awk sed

我有一个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                                                                                                                                                                                 
.....

    ....     

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这是一个相当长的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