Wie man sed benutzt, um eine ganze Zeile durch eine andere mit Zeichen zu ersetzen

779
Helme

Die Datei enthält folgende Zeile 19

send -- "old@example.com\r"

Ich möchte die E-Mail ändern, dachte ich und kam dazu

sed -i.bak '19s/.*/send -- "new@example.com\r"/' ./a 

es ändert sich Zeile 19, aber was ich bekomme, ist

"end -- "new@example.com 

Was ist los und wie kann ich das beheben?

0

3 Antworten auf die Frage

0
l0b0

Backslash ist das Escape - Zeichen in sedMustern, so dass ein Literal Wagenrücklauf eingesetzt ist. Was Sie wollen, ist \\r- ein umgekehrter Schrägstrich, gefolgt von einem Literal r.

Ich glaube, ich muss ein bisschen schlafen, haha! danke für Ihre Hilfe! Helme vor 6 Jahren 0
0
fpmurphy1

Anstatt zu suchen und zu ersetzen, können Sie einfach die 19. Zeile ändern:

sed '19c\send -- "new@example.com\\r"' 
0
cas

Sie machen das schwieriger, als es sein muss - ändern Sie einfach die E-Mail-Adresse, nicht die gesamte Zeile. Demonstrieren:

$ echo 'send -- "old@example.com\r"' | sed 's/old@example\.com/new@example.com/' send -- "new@example.com\r" 

Übrigens, Sie können optional den gModifizierer (global) am Ende des Befehls s///command verwenden, wenn das Suchmuster in einer Zeile mehr als einmal vorkommt, und / oder den iModifikator (Fall ignorieren), wenn Sie eine Groß- / Kleinschreibung verwenden möchten, z verwenden beide: s/old@example\.com/new@example.com/ig.

Auf jeden Fall würde Ihr Befehl dann so aussehen:

sed -i.bak '19s/old@example\.com/new@example.com/' ./a 

Wenn Sie die genaue zu ändernde Zeilennummer nicht kennen, geben Sie einen regulären Ausdruck als Zeileadresse anstelle einer Zeilennummer an:

sed -i.bak '/^send.*old@example\.com/ s/old@example\.com/new@example.com/' ./a 

Es ist noch einfacher ALLE Vorkommen von old@example.com in der Datei zu ändern. Geben Sie einfach keine Adresse an, und die Ersetzung erfolgt in jeder Zeile der Datei.

sed -i.bak 's/old@example\.com/new@example.com/' ./a 
Die Sache ist sed kann sehr leicht kryptisch und schwer zu bewältigen sein, ich habe etwas anderes gemacht und dies war nur ein Hindernis, das ich auf jeden Fall überwinden wollte, aber ein riesiger Dank für Ihre Hilfe! Helme vor 6 Jahren 0