用awk / sed替换XML文件中的字符串和来自另一个文件的字符串

时间:2016-02-12 09:36:10

标签: xml linux awk sed

很抱歉这个漫长/怪异的标题,但我遇到了一个问题。我有这个XML文件:

</member>
     <member>
      <name>TransactionID</name>
      <value><string>123456789123456</string></value>
     </member>
     <member>
      <name>Number</name>
      <value><string>765101293</string></value>
     </member>

在那里,我必须用另一个文件file2替换“765101293”:

765003448
765885388
764034143
784478101
762568592
769765134
767200702
769550613
784914007
762333840

因此,XML文件将在file2的每个新字符串中更改。我不知道该怎么做。我想首先用awk处理file2,然后用sed管道输入:

代码:

#! /bin/bash -f

var=`awk -F,"\n" '{print $0}' "$1"`
sed -i "/7[0-9]{8}/c\$var/" "$2"

所以,我想用file2中的数据更新我的XML文件(Update.xml)。对于file2的第一行,我将不得不更新现有的XML:而不是“765101293”我将把第一行放在file2&gt; 765003448.然后我将xml移动到其他地方,然后我将传递到file2上的下一行。对file2的所有行重复此过程。我运行脚本时使用的两个变量$ 1和$ 2:./ script.sh file2 Update.xml。

有人可以帮帮我吗?

编辑:

这是我的完整xml文件:

<methodCall>
 <methodName>UpdateOffer</methodName>
 <params>
  <param>
   <value>
    <struct>
     <member>
      <name>offerID</name>
      <value><i4>19</i4></value>
     </member>
     <member>
<name>startDate</name>
<value><dateTime.iso8601>20151028T14:11:00+0200</dateTime.iso8601></value>
</member>
     <member>
      <name>offerType</name>
      <value><i4>0</i4></value>
     </member>
     <member>
      <name>originHostName</name>
      <value><string>TEST</string></value>
     </member>
     <member>
      <name>originNodeType</name>
      <value><string>Prepaid</string></value>
     </member>
     <member>
      <name>originOperatorID</name>
      <value><string>operator</string></value>
     </member>
<member><name>originTimeStamp</name>
<value><dateTime.iso8601>20151028T14:16:36+0200</dateTime.iso8601></value>
</member>
     <member>
      <name>originTransactionID</name>
      <value><string>123456789123456</string></value>
     </member>
     <member>
      <name>subscriberNumber</name>
      <value><string>765101293</string></value>
     </member>
    </struct>
   </value>
  </param>
 </params>
</methodCall>

1 个答案:

答案 0 :(得分:0)

听起来你只需要:

awk 'NR==FNR{nums[NR]=$0;next} sub(/>7[0-9]{8}</,">"nums[i+1]"<"){i++}' file2 Update.xml

但鉴于您的问题中的小样本XML文件输入/输出,很难猜到。

请记住这一点:

  1. 每次在shell中编写一个循环来操作文本时,你的方法都是错误的。见https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice
  2. shell是一个操作文件和进程以及对工具进行调用的环境。用于操作文本的UNIX工具是awk。阅读由Arnold Robbins撰写的Effective Awk Programming,4th Edition一书。