
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&Welcome</c>
</b>
<d>Hello & How are you?</d>
</a>
Ich verwende den sed-Befehl wie folgt, um alle Vorkommen von & in & zu ändern
sed -i 's:&:&:' 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, sed
benötigt einen Parameter für-i
sed -i.bak 's:&:&:' myfile.xml
und eine Sicherungsdatei ist sinnvoll oder …
… Perl verwenden;)
Testen mit
perl -pe 's/&/&/' myfile.xml
und machen Sie eineBearbeitung direkt vor Ortmit
perl -pi -e 's/&/&/' myfile.xml
Aber nur einmal.
Nach dem Befehl myfile.xml
ist der Inhalt von
<!--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>
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\&|g' yourfile.xml
. Dadurch entsteht:
<!--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>
Der zweite Durchgang wird sein:
sed 's|Hello\ \&| \Hello\ \&|g' test.xml
. Erzeugt:<!--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>
Verwenden Sie natürlich
-i
einen Schalter, um es dauerhaft zu machen.
Eine weitere fortgeschrittene Methode basierend auf dem Kommentar von @terdon unten ist:
sed -e 's/Hello &/Hello \&/' -e 's/Hi&/Hi\&/' filename.xml