I want to replace a string {Change_me} inside <value>{Change_me}</value>
in target.xml using the value I extracted from source.xml
- Below are my files
source.xml
<name>App1</name>
<value>#!@+aw13dawe=</value>
<name>App2</name>
<value>=313ak#a!@BAd</value>
<name>App3</name>
<value>!23aaB8=l6</value>
<name>App4</name>
<value>0913@aa!#=</value>
target.xml
<name>App1</name>
<value>{Change_me}</value>
<name>App2</name>
<value>{Change_me}</value>
<name>App3</name>
<value>{Change_me}</value>
<name>App4</name>
<value>{Change_me}</value>
forloop file list.txt
App1
App2
App3
App4
script1 (below the sed works in a linux system but not in SunOS unknown 5.10 Generic_147148-26 i86pc i386 i86pc)
#!/bin/ksh
a={Change_me}
for i in $(cat list.txt) ;
do sed -i.bak "0,/$a/s//$(grep $i source.xml -A1 | grep value | grep -oP '(?<=value>).*?(?=</value>)')/" target.xml;
done
Script2 that I wrote in Solaris which I'm having an issue.
#!/bin/ksh
a={Change_me}
for i in $(cat list.txt) ;
do sed -e "0,/"$a"/s//"$(/usr/sfw/bin/ggrep $i -A1 source.xml | grep value | sed -e 's/.*<value>\(.*\)<\/value>.*/\1/')"" target.xml ;
done
Results:
# ksh -x change.ksh
/bin/pwd
2> /dev/null
PWD=/scripts/middleware
+ a={Change_me}
+ cat list.txt
+ /usr/sfw/bin/ggrep App1 -A1 source.xml
+ grep value
+ sed -e s/.*<value>\(.*\)<\/value>.*/\1/
+ sed -e 0,/{Change_me}/s//#!@+aw13dawe= target.xml
sed: command garbled: 0,/{Change_me}/s//#!@+aw13dawe=
+ /usr/sfw/bin/ggrep App2 -A1 source.xml
+ grep value
+ sed -e s/.*<value>\(.*\)<\/value>.*/\1/
+ sed -e 0,/{Change_me}/s//=313ak#a!@BAd target.xml
sed: command garbled: 0,/{Change_me}/s//=313ak#a!@BAd
+ /usr/sfw/bin/ggrep App3 -A1 source.xml
+ grep value
+ sed -e s/.*<value>\(.*\)<\/value>.*/\1/
+ sed -e 0,/{Change_me}/s//!23aaB8=l6 target.xml
sed: command garbled: 0,/{Change_me}/s//!23aaB8=l6
+ /usr/sfw/bin/ggrep App4 -A1 source.xml
+ grep value
+ sed -e s/.*<value>\(.*\)<\/value>.*/\1/
+ sed -e 0,/{Change_me}/s//0913@aa!#= target.xml
sed: command garbled: 0,/{Change_me}/s//0913@aa!#=
sed -i is not working in solaris, that's why I used sed -e, but as shown in the result it does not work as expected, your help and advice is highly appreciated.
Here is the good case output Note: Only Works on Linux (RHEL 7 - testmachine)
[root@vmserver1 ~]# bash -x change.sh
+ a='{Change_me}'
++ cat list.txt
+ for i in '$(cat list.txt)'
++ grep App1 source.xml -A1
++ grep value
++ grep -oP '(?<=value>).*?(?=</value>)'
+ sed -i.bak '0,/{Change_me}/s//#!@+aw13dawe=/' target.xml
+ for i in '$(cat list.txt)'
++ grep App2 source.xml -A1
++ grep value
++ grep -oP '(?<=value>).*?(?=</value>)'
+ sed -i.bak '0,/{Change_me}/s//=313ak#a!@BAd/' target.xml
+ for i in '$(cat list.txt)'
++ grep App3 source.xml -A1
++ grep value
++ grep -oP '(?<=value>).*?(?=</value>)'
+ sed -i.bak '0,/{Change_me}/s//!23aaB8=l6/' target.xml
+ for i in '$(cat list.txt)'
++ grep App4 source.xml -A1
++ grep value
++ grep -oP '(?<=value>).*?(?=</value>)'
+ sed -i.bak '0,/{Change_me}/s//0913@aa!#=/' target.xml
[root@vmserver1 ~]#
Good Result of target.xml
[root@vmserver1 ~]# cat target.xml
<name>App1</name>
<value>#!@+aw13dawe=</value>
<name>App2</name>
<value>=313ak#a!@BAd</value>
<name>App3</name>
<value>!23aaB8=l6</value>
<name>App4</name>
<value>0913@aa!#=</value>