Ich habe ein Verzeichnis voller XML-Dateien, die so aussehen, und für die ich den Wert der Elementnummer „Offset“ von 1 auf eine andere Zahl ändern möchte
$ cat my.xml
<offset xmlns="">1</offset>
Ich habe verschiedene Kombinationen dieses sed-Befehls geschrieben, aber nichts davon lief ohne Fehler. Ich bin ziemlich sicher, dass ich einige der Zeichen maskieren muss, aber die, die ich ausprobiert habe, enden immer mit Fehlern („unerwartetes Token“, „unbekannte Option“ usw.). Ich habe es auch ohne das Flag -e versucht, da es eigentlich kein Ausdruck ist.
sed -i -e s/<offset xmlns="">1</offset>/<offset xmlns="">99</offset>/ *.xml
Jede Hilfe wäre willkommen.
Antwort1
Sie müssen es nicht in sed verwenden /
, Sie können zum Beispiel ein Komma verwenden:
sed -i 's,<offset xmlns="">1</offset>,NEW_TEXT,' FILE
Antwort2
Versuche dies,
$ sed 's~<offset xmlns="">1~<offset xmlns="">99~g' file
<offset xmlns="">99</offset>
Verwenden Sie ein anderes Sed-Trennzeichen, wenn die Eingabe Schrägstriche enthält.
Antwort3
Normalerweise brauchen Sie das alles nicht in der s/earch/replace/
Funktion selbst, sondern können stattdessen first /address/
then conditionally /s///
verwenden. Das kann nicht nur die Lesbarkeit verbessern und einige der von Ihnen erwähnten Probleme vermeiden, sondern auch die Leistung steigern:
sed '/offset xmlns=/s/>1</>99</'
Antwort4
Ich würde das 17. Zeichen der Zeile ersetzen, das den Wert enthält:
sed -i 's/^\(.\{17\}\)./\1VALUE/' file.xml
Ersetzen Sie VALUE durch den neuen Wert für <offset>
. Beispiel:
sed -i 's/^\(.\{17\}\)./\18/' file.xml
um es auf 8 zu ändern.