Shell or perl script to replace XML text in bulk

Hi,
I am looking for assistance over shell or perl (without XML twig module) which replace string in XML file under particular branch..example of code file sample..

Exact requirment : Replace "Su saldo es" in below file with "Your balance" but only in XML branch of Text id=98 and Text Id=12 Not globally.

==

 
<Text Id="98">
<Language id="1">Su saldo es $mainAccountBalance1Tiene ademas $dedicatedAccount1Balance1 mensajes de texto</Language>
<Language id="2"></Language>
<Language id="3">Su saldo es $mainAccountBalance1Tiene ademas $dedicatedAccount1Balance1 mensajes de texto</Language>
<Language id="4">Su saldo es $mainAccountBalance1Tiene ademas $dedicatedAccount1Balance1 mensajes de texto</Language>
</Text>
<Text Id="96"> 
<Language id="1">Su saldo es $mainAccountBalance1.</Language>
<Language id="2">Su saldo es $mainAccountBalance1.</Language>
</Text>
<Text Id="12"> 
<Language id="1">Su saldo es $mainAccountBalance1.</Language>
<Language id="2">Your balance  $mainAccountBalance1.</Language> 
</Text>

With assumptions about your input structure:

awk '/^<Text Id="(98|12)">/{s=1;print;next}
/^<\/Text>/{s=0;print;next}
s{gsub(/Su saldo /,"Your balance ")}1' file

getting sysntax error when i execute what you written over XML file

awk: syntax error near line 1 )
awk: bailing out near line 1

When i execute part of awk it give me below output .

root@host1&gt; awk '/^<Text Id="(98|12)">/{s=1;print;next}/^<\/Text>/{s=0;print;next}' test.xml

</Text>
<Text Id="98">
</Text>
</Text>
<Text Id="12">
</Text>

Use /usr/xpg4/bin/awk or nawk instead of awk .

Well, it works Elixir thanks :slight_smile:
But i am wondering if there is way to give list of Text id from external file instead of just 98 and 12 as mentioned in code..

^<Text Id="(98|12)">/
cat pattfile
98
12

nawk 'FNR==NR{a[$1];next}
match($0,/^<Text Id="[^"]*">/){if(substr($0,11,RLENGTH-12) in a) s=1;print;next}
/^<\/Text>/{s=0;print;next}
s{gsub(/Su saldo/,"Your balance")}1' pattfile mainfile
1 Like

Hi Elixir,
it work like charm..could you modify the code such a way that it add XML tag (first 2 lines) at start and close at end of file..example of output similiar to this

<Request Type="XML" Operation="Set">
 <Type> 
<Text Id="98">
<Language id="1">Your balance es $mainAccountBalance1Tiene ademas $dedicatedAccount1Balance1 mensajes de texto</Language>
<Language id="2"></Language>
<Language id="3">Your balance es $mainAccountBalance1Tiene ademas $dedicatedAccount1Balance1 mensajes de texto</Language>
<Language id="4">Your balance es $mainAccountBalance1Tiene ademas $dedicatedAccount1Balance1 mensajes de texto</Language>
</Text>
<Text Id="96">
<Language id="1">Su saldo es $mainAccountBalance1.</Language>
<Language id="2">Su saldo es $mainAccountBalance1.</Language>
<Language id="3">Su saldo es $mainAccountBalance1.</Language>
<Language id="4">Su saldo es $mainAccountBalance1.</Language>
</Text>
<Text Id="12">
<Language id="1">Your balance es $mainAccountBalance1.</Language>
<Language id="2">Your balance  $mainAccountBalance1.</Language>
<Language id="3">Your balance es $mainAccountBalance1.</Language>
<Language id="4">Your balance es $mainAccountBalance1.</Language>
</Text>
</Type>
 </Request>

Thanks again !

awk 'FNR==NR{a[$1];next}
FNR==1{print "<Request Type=\"XML\" Operation=\"Set\">\n<Type>"}
match($0,/^<Text Id="[^"]*">/){if(substr($0,11,RLENGTH-12) in a) s=1;print;next}
/^<\/Text>/{s=0;print;next}
s{gsub(/Su saldo/,"Your balance")}1
END{print "</Type>\n</Request>"}' pattfile mainfile