Die Datei enthält in Zeile 19 Folgendes
send -- "[email protected]\r"
Ich möchte die E-Mail ändern, also habe ich nachgedacht und mir das ausgedacht
sed -i.bak '19s/.*/send -- "[email protected]\r"/' ./a
es ändert Zeile 19, aber was ich bekomme ist
"end -- "[email protected]
Was läuft schief und wie kann ich es beheben?
Antwort1
Der Backslash ist das Escape-Zeichen in sed
Mustern, daherwörtlichWagenrücklauf wird eingefügt. Was Sie wollen, ist \\r
- ein maskierter Backslash, gefolgt von einem Literal r
.
Antwort2
Anstatt eine Suche und Ersetzung durchzuführen, können Sie einfach die 19. Zeile ändern:
sed '19c\send -- "[email protected]\\r"'
Antwort3
Sie machen es unnötig kompliziert – ändern Sie einfach die E-Mail-Adresse, nicht die ganze Zeile. Zur Veranschaulichung:
$ echo 'send -- "[email protected]\r"' | sed 's/old@example\.com/[email protected]/'
send -- "[email protected]\r"
Übrigens können Sie optional den g
Modifikator (global) am Ende des Befehls verwenden s///
, wenn das Suchmuster mehr als einmal in einer Zeile vorkommen könnte, und/oder den i
Modifikator (Groß-/Kleinschreibung ignorieren), wenn Sie bei der Suche die Groß-/Kleinschreibung nicht berücksichtigen möchten – z. B. um beides zu verwenden: .s/old@example\.com/[email protected]/ig
Ihr Befehl würde dann jedenfalls folgendermaßen aussehen:
sed -i.bak '19s/old@example\.com/[email protected]/' ./a
Wenn Sie die genaue zu ändernde Zeilennummer nicht kennen, geben Sie als Zeilenadresse statt einer Zeilennummer einen regulären Ausdruck an:
sed -i.bak '/^send.*old@example\.com/ s/old@example\.com/[email protected]/' ./a
Noch einfacher ist es, ALLE Vorkommen von[email geschützt]Geben Sie in der Datei einfach keine Adresse an. Die Ersetzung erfolgt dann in jeder Zeile der Datei.
sed -i.bak 's/old@example\.com/[email protected]/' ./a