![Wie ersetzt man mithilfe von Unix-Befehlen eine Zeile in einer XML-Datei durch eine Reihe von Zeilen, die in einer Variablen oder Datei gespeichert sind?](https://rvso.com/image/1414653/Wie%20ersetzt%20man%20mithilfe%20von%20Unix-Befehlen%20eine%20Zeile%20in%20einer%20XML-Datei%20durch%20eine%20Reihe%20von%20Zeilen%2C%20die%20in%20einer%20Variablen%20oder%20Datei%20gespeichert%20sind%3F.png)
Ich habe eine XML-Datei
wobei die zu suchende Zeile lautet:
SEARCH='<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC>'
Dieser gesuchte Wert muss durch den Wert in der folgenden Variable ersetzt werden oder kann auch in einer anderen Datei gespeichert werden:
REPLACE='<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC><ErrorContext><CompatibilityMode>0</CompatibilityMode><ErrorOutput>1</ErrorOutput>.......some more tags.....</MethodContext>
'
Wie kann dies mit Unix-Befehlen wie SED oder AWK durchgeführt werden? (Hier muss SEARCH durch REPLACE ersetzt werden.
Antwort1
Ja, das könnte mit sed gemacht werden, aber ich stimme Jens zu. Ich würde empfehlen, ein geeignetes Tool wie Python + lxml-Bibliothek zum Suchen und Ersetzen Ihrer Tags zu verwenden.
Antwort2
Soweit ich dies erkennen kann, sind dies die zu maskierenden Zeichen:
awk '/<\?xml version="1.0" encoding="UTF-8" standalone="no"\?><SSC>/ {print "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><SSC><ErrorContext><CompatibilityMode>0</CompatibilityMode><ErrorOutput>1</ErrorOutput>.......some more tags.....</MethodContext>"}' <<< '<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC>'
- im SUCHFELD: Sie möchten die ?-Zeichen durch \? maskieren.
- im Feld REPLACE: Sie möchten die " Zeichen durch \" maskieren
Oder wenn Sie Variablen verwenden müssen, maskieren Sie " auch im SUCHFELD und maskieren Sie die Zeichen zweimal, einmal zum Speichern in einer Variablen und zweimal zum Wiedergeben!
SEARCH_escaped=`sed -e 's/\?/\\\?/g' -e 's/\"/\\\"/g' <<< $SEARCH`
REPLACE_escaped=`sed 's/\"/\\\"/g' <<< $REPLACE`
awk "/$SEARCH_escaped/ {print \"$REPLACE_escaped\"}" <<< $SEARCH