Replace string in XML file with awk/sed with string from another file

半世苍凉 提交于 2020-01-07 02:44:15

问题


Sorry for the long/weird title but I'm stuck on a problem I have. I have this XML file:

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

There, I have to replace the "765101293" with another value from another file, file2:

765003448
765885388
764034143
784478101
762568592
769765134
767200702
769550613
784914007
762333840

So, the XML file will change at each new string from file2. I am not sure how to do this. I am thinking of first processing file2 with awk and then a pipe feeding into sed:

Code:

#! /bin/bash -f

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

So, I would like to update my XML file (Update.xml) with the data from file2. For the first line of file2, I will have to update the existing XML: instead of "765101293" i'll put the first line of file2 > 765003448. Then I'll move the xml somewhere else, and then I'll pass to the next line on file2. Repeat the process for all lines of file2. The two variables $1 and $2 I used when I run my script like this: ./script.sh file2 Update.xml.

Could anyone help me out?

EDIT:

Here is my full xml file:

<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:


It sounds like all you need is:

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

but it's hard to guess given the small sample XML file input/output in your question.

Please remember this:

  1. Every time you write a loop in shell to manipulate text you have the wrong approach. See https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice.
  2. A shell is an environment from which to manipulate files and processes and sequence calls to tools. The UNIX tool to manipulate text is awk. Read the book Effective Awk Programming, 4th Edition, by Arnold Robbins.


来源:https://stackoverflow.com/questions/35359144/replace-string-in-xml-file-with-awk-sed-with-string-from-another-file

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!