简体   繁体   中英

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

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>

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM