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> 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
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