Suchen und Ersetzen eines Zeichens in einer XML-Datei mit dem sed-Befehl funktioniert nicht

Suchen und Ersetzen eines Zeichens in einer XML-Datei mit dem sed-Befehl funktioniert nicht

Ich habe eine XML-Datei namens myfile.xml

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&Welcome</c>
   </b>
   <d>Hello & How are you?</d>
</a>

Ich will diese Transformation

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&amp;Welcome</c>
   </b>
   <d>Hello &amp; How are you?</d>
</a>

Ich verwende den sed-Befehl wie folgt, um alle Vorkommen von & in & zu ändern

sed -i 's:&:&amp;:' myfile.xml

aber ich erhalte die Fehlermeldung „undefiniertes Label ‚yfile.xml‘. Ich kann nicht weitermachen. Wie mache ich das?

Antwort1

Wenn Sie nicht habenGNU sed, sedbenötigt einen Parameter für-i

sed -i.bak 's:&:&amp;:' myfile.xml

und eine Sicherungsdatei ist sinnvoll oder …

… Perl verwenden;)

Testen mit

perl -pe 's/&/&amp;/' myfile.xml

und machen Sie eineBearbeitung direkt vor Ortmit

perl -pi -e 's/&/&amp;/' myfile.xml

Aber nur einmal.

Nach dem Befehl myfile.xmlist der Inhalt von

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&amp;Welcome</c>
   </b>
   <d>Hello &amp; How are you?</d>
</a>

Antwort2

Sie müssen entkommen und zwar wegen des Sonderzeichens. Und Sie benötigen zwei Durchgänge, um es abzuschließen.

Verwendung:
1. sed 's|Hi\&|Hi\&amp;|g' yourfile.xml. Dadurch entsteht:

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&amp;Welcome</c>
   </b>
   <d>Hello & How are you?</d>
</a>
  1. Der zweite Durchgang wird sein: sed 's|Hello\ \&| \Hello\ \&amp;|g' test.xml. Erzeugt:

    <!--This is an xml document for test-->
    <a><!--This is root node-->
       <b>
        <c>Hi&amp;Welcome</c>
       </b>
       <d> Hello &amp; How are you?</d>
    </a>
    

    Verwenden Sie natürlich -ieinen Schalter, um es dauerhaft zu machen.

Eine weitere fortgeschrittene Methode basierend auf dem Kommentar von @terdon unten ist:

sed -e 's/Hello &/Hello \&amp;/' -e 's/Hi&/Hi\&amp;/' filename.xml

verwandte Informationen