使用Shell脚本提取XML标记并附加到另一个xml中的特定位置

时间:2015-04-08 16:05:44

标签: xml shell awk sed xmllint

我有两个许可证xml文件:a-license.xmlb-license.xml。两个许可证文件的格式相同。我想将它们合并到一个文件中。

示例输入:

文件a-license.xml包含

   <company-license>
   <generator></generator>
   <customer></customer>
   <orderid></orderid>
   <expiration></expiration>
   <license>
      <module>A</module>
      <license_key>xxxx-xxxx-xxxxx</license_key>
   </license>
   </company-license>

文件b-license.xml包含

  <company-license>  
   <generator></generator>
   <customer></customer>
   <orderid></orderid>
   <expiration></expiration>
   <license>
      <module>B</module>
      <license_key>yyyy-yyyy-yyyy</license_key>
   </license>
   </company-license>

所需的输出应该类似于

  <company-license> 
   <generator></generator>
   <customer></customer>
   <orderid></orderid>
   <expiration></expiration>
   <license>
      <module>A</module>
      <license_key>xxxx-xxxx-xxxxx</license_key>
   </license>
   <license>
      <module>B</module>
      <license_key>yyyy-yyyy-yyyy</license_key>
   </license>
   </company-license>

我想从<license>中提取a-license.xml代码并将其附加在<license>的{​​{1}}代码下方。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

sed -n '1,/<license>/{/<license>/d;p;}' a-license.xml > new-license.xml
sed -n '/<license>/,/<\/license>/p' a-license.xml >> new-license.xml
sed -n '/<license>/,/<\/company-license>/p' b-license.xml >> new-license.xml

或更短:

sed -n '1,/<\/license>/p' a-license.xml > new-license.xml
sed -n '/<license>/,$p' b-license.xml >> new-license.xml

输出到文件new-license.xml:

<company-license>
   <generator></generator>
   <customer></customer>
   <orderid></orderid>
   <expiration></expiration>
   <license>
      <module>A</module>
      <license_key>xxxx-xxxx-xxxxx</license_key>
   </license>
   <license>
      <module>B</module>
      <license_key>yyyy-yyyy-yyyy</license_key>
   </license>
   </company-license>

答案 1 :(得分:1)

$ awk 'NR==FNR{print;next} /<license>/{f=1} f' fileA fileB
<generator></generator>
<customer></customer>
<orderid></orderid>
<expiration></expiration>
<license>
   <module>A</module>
   <license_key>xxxx-xxxx-xxxxx</license_key>
</license>
<license>
   <module>B</module>
   <license_key>yyyy-yyyy-yyyy</license_key>
</license>