Hi,
I have a xml file that I need to modify 1 line to change some value from 2 to 10 (or any number).
Sample input:
<!-- some text here>
.
.
.
<message:test name="ryan">
<message:sample-channel charset="UTF-8" max-value="2" wait="20">
<message:sample>test123</message:sample>
</message:sample-channel>
</message:test>
Basically, I only need to update the max-value from 2 to any number (i.e. 10). However, there are multiple occurrences of the ff line in the xml.
<message:sample-channel charset="UTF-8" max-value="2" wait="20">
The only unique line that can be used as pattern is '<message:test name="ryan">'
Is there a sed or awk command that can be used to update the max-value?
Hello brichigo,
Following may help, lets say our input file is as follows.
cat test14
<message:test name="ryan">
<message:sample-channel charset="UTF-8" max-value="2" wait="20">
<message:sample>test123</message:sample>
</message:sample-channel>
</message:test>
<message:test name="ryan">
<message:sample-channel charset="UTF-8" max-value="3" wait="20">
<message:sample>test123</message:sample>
</message:sample-channel>
</message:test>
<message:test name="ryan">
<message:sample-channel charset="UTF-8" max-value="5" wait="20">
<message:sample>test123</message:sample>
</message:sample-channel>
</message:test>
Then code is as follows.
awk '/<message:test name="ryan">/ {print $0;getline;gsub(/[[:digit:]]/,"10",$3);} 1' test14
Output will be as follows.
<message:test name="ryan">
<message:sample-channel charset="UTF-8" max-value="10" wait="20">
<message:sample>test123</message:sample>
</message:sample-channel>
</message:test>
<message:test name="ryan">
<message:sample-channel charset="UTF-8" max-value="10" wait="20">
<message:sample>test123</message:sample>
</message:sample-channel>
</message:test>
<message:test name="ryan">
<message:sample-channel charset="UTF-8" max-value="10" wait="20">
<message:sample>test123</message:sample>
</message:sample-channel>
</message:test>
Just taken example as per your guven input. So kindly let me know if this helps.
Thanks,
R. Singh
Thanks Ravinder! I will try this and will let you know if it helps.
akshay@nio:/tmp$ cat file.xml
<!-- some text here>
.
.
.
<message:test name="ryan">
<message:sample-channel charset="UTF-8" max-value="2" wait="20">
<message:sample>test123</message:sample>
</message:sample-channel>
</message:test>
akshay@nio:/tmp$ sed -E 's@(.*)(max-value)="[^"]*"@\1\2="any number"@g' file.xml
Resulting
<!-- some text here>
.
.
.
<message:test name="ryan">
<message:sample-channel charset="UTF-8" max-value="any number" wait="20">
<message:sample>test123</message:sample>
</message:sample-channel>
</message:test>
Hi Ravinder,
It is working as expected. Thank you.
One more question, how can I add leading white spaces on the same line so that the xml format is still the same as before?
---------- Post updated at 08:42 PM ---------- Previous update was at 08:39 PM ----------
Thanks Akshay but -E option is not available in our UNIX machine. We're using AIX.
Aia
6
The -E is only a nicety, it can be dropped if the `()' are escaped.
e.i
sed 's@\(max-value="\)[0-9]*"@\1any number"@' file.xml
The space you mentioned is preserved
And so it can be done with Perl as well
perl -wlpe 's/(max-value=")\d+/$1any_number/' file.xml
---------- Post updated at 09:05 PM ---------- Previous update was at 08:28 PM ----------
In case you have similar lines containing max-value that you don't want to touch, here's another solution in Perl, preserving indentation as well.
perl -wlpe '$p and s/(max-value=")\d+/$1NUMBER/; $p = /<message:test name="ryan">/' file.xml