Verwenden von sed mit Sonderzeichen

Verwenden von sed mit Sonderzeichen

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.

verwandte Informationen