Find and update line in xml file

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.

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