Wie kann ich Text nach einem bestimmten Wort mit sed ersetzen?

11

Ich habe eine Datei mit dem Namen .ignore. In der Notwendigkeit, die zu ersetzen projdir. Beispielsweise:

ignore \..*
ignore README
projdir Snake

Ich muss Snake zum Beispiel durch "PacMan" ersetzen. Ich habe die Manpage gelesen, aber ich habe keine Ahnung, was ich tun soll.

Jakub Baski Gabčo
quelle

Antworten:

16

Suchen Sie nach einer Zeile, die mit beginnt projdir, und ersetzen Sie die gesamte Zeile durch eine neue:

sed -i 's/^projdir .*$/projdir PacMan/' .ignore

^und $sind Anfangs- / Zeilenende-Markierungen, sodass das Muster mit der gesamten Zeile übereinstimmt. .*passt zu allem. Das -isagt sed, dass die Änderungen direkt geschrieben werden sollen .ignore, anstatt sie nur auszugeben

Michael Mrozek
quelle
5

Ein Ansatz besteht darin, die gesamte Zeile neu zu schreiben und dabei Rückreferenzen für die Teile zu verwenden, die Sie behalten möchten:

sed -e 's/^\( *projdir  *\)[^ ]*\(.*\)*$/\1PacMan\2/'

Ein anderer Ansatz besteht darin, diesen Teil der Zeile neu zu schreiben, jedoch nur, wenn ein anderer Teil übereinstimmt:

sed -e '/^ *projdir / s/ [^# ]/ PacMan/'

In beiden Beispielen wird das zweite durch Leerzeichen getrennte Wort in Zeilen umgeschrieben, in denen sich das erste Wort befindet projdir.

Gilles 'SO - hör auf böse zu sein'
quelle
3

Obwohl dies ein alter Beitrag ist und er durch die akzeptierte Antwort für Sie gelöst zu sein scheint, wurde die eigentliche Frage nicht beantwortet. Der Vollständigkeit halber und um anderen zu helfen:

Hier die Antwort, die tatsächlich zu "Snake" passt und nicht zu Zeilen, die mit "projdir" beginnen ...

sed -r 's/(^.*)Snake/\1PacMan' .ignore

Dies ersetzt alles vom Anfang der Zeile einschließlich "Schlange" durch alles vor "Schlange" + "PacMan". \ 1 steht für das, was in () übereinstimmt. Alles nach "Snake" bleibt unberührt.

moritz
quelle
1
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore

^ projdir soll die Zeile finden, die mit string projdir beginnt. Das. * $ Dort steht für den String nach projdir in der Zeile der gleichen Zeile. Der String projdir PacMan ist der String, durch den wir ersetzen. g ist für global - um alle diese Zeilen zu ersetzen, die mit projdir beginnen. .ignore ist der Name der Datei

Tinu
quelle
1
Können Sie bitte Ihre Antwort erweitern und klarstellen, was was ist?
Romeo Ninov
Antworten sind viel nützlicher, wenn sie Erklärungen dazu enthalten, wie und warum ein Befehl oder ein Code funktioniert.
Anthony Geoghegan
Ich hoffe, dass dies nach der Bearbeitung nützlicher ist
Tinu