Skip to content
Advertisement

Not able to change DOCTYPE line of a xml file in bash

I have a xml file with name alphabet.xml like below : –

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE models SYSTEM "mp.dtd">
<models>
    <class name="ABC">
      <attribute name="a"/>
      <attribute name="b"/>
      <attribute name="c"/>
    </class>
    <class name="DEF">
      <attribute name="d"/>
      <attribute name="e"/>
      <attribute name="f"/>
    </class>
    <class name="GHI">
      <attribute name="g"/>
      <attribute name="h"/>
      <attribute name="i"/>
    </class>
    <class name="JKL">
      <attribute name="j"/>
      <attribute name="k"/>
      <attribute name="l"/>
    </class>
 </models>

Now I want to replace <!DOCTYPE models SYSTEM "mp.dtd"> String of alphabet.xml with <!DOCTYPE models SYSTEM "/opt/nms_cif_mp/dat/mp.dtd">

code I am using is in below . But with this code replacement of the above specific string is not happening .

cd /home/abinash/Desktop/MyFolder/
file_name="alphabet.xml"
from_dtd='<!DOCTYPE models SYSTEM "mp.dtd">'
to_dtd='<!DOCTYPE models SYSTEM "/opt/nms_cif_mp/dat/mp.dtd">'
#Basically using awk I am trying to replace the string and then write it   into tmp.xml .
#After that I am copying the content of tmp.xml into alphabet.xml .
awk '{ if (NR == 2) print "<!DOCTYPE models SYSTEM "/opt/ericsson /nms_cif_mp/dat/mp.dtd""; else print $0}' /home/abinash/Desktop/MyFolder /$file_name > /home/abinash/Desktop/MyFolder/tmp.xml
cp /home/abinash/Desktop/MyFolder/tmp.xml  /home/abinash/Desktop/MyFolder /$file_name

NOTE : The above code logic works if I will replace <!DOCTYPE models SYSTEM "mp.dtd"> with any word(tried with hello word) , but not with <!DOCTYPE models SYSTEM "/opt/nms_cif_mp/dat/mp.dtd">

Is there any special handling required here ?

Advertisement

Answer

The problem is with the quoting inside the Awk command. You can simplify this a lot by passing the value of $to_dtd to an Awk variable, if the -v option is supported with your Awk:

awk -vdtd="$to_dtd" 'NR == 2 { print dtd } NR != 2 { print }' /home/abinash/Desktop/MyFolder /$file_name > /home/abinash/Desktop/MyFolder/tmp.xml
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement