mit mehrfachem Ausdruck für In-Place-Argumentation

23

Ich versuche, mehrere Wörter in der Datei mit zu ersetzen sed -i #expression1 #expression2

Datei

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

Ausgang (Gewünscht)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

Probierversuche

Ich kann die folgende Ausgabe erhalten, indem ich sed -ifür 2mal benutze .

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

Kann ich irgendeinen Weg finden, dies als einzelnen In-Place-Befehl auszuführen?

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

Als ich den obigen Code ausprobiert habe, dauert es s/item/stuff/gals Datei und versucht, daran zu arbeiten.

JigarGandhi
quelle
Wenn Ihre Dateien dem obigen Beispiel ähnlich sind (dh sie folgen demselben Muster), können Sie dies mit einer einzigen Ersetzung tun:sed - i 's/Some\(.*\)item/any\1stuff/' file
don_crissti

Antworten:

26

Abhängig von der Version von sedauf Ihrem System können Sie dies möglicherweise tun

sed -i 's/Some/any/; s/item/stuff/' file

Sie brauchen hier keinen gSchrägstrich nach dem letzten Schrägstrich im sBefehl, da Sie nur einen Ersatz pro Zeile ausführen.

Alternative:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

Die -iOption teilt sedmit, dass Dateien an Ort und Stelle bearbeitet werden sollen. wenn es Zeichen unmittelbar nach dem sind -idann sedmacht ein Backup der Originaldatei und verwendet diese Zeichen als die Erweiterung der Sicherungsdatei. Z.B,

sed -i.bak 's/Some/any/; s/item/stuff/' file

oder

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

wird geändert fileund speichert das Original in file.bak.

Natürlich verwenden wir auf einem Unix-System (oder einem Unix-ähnlichen System) normalerweise '~' und nicht '.bak'

sed -i~ 's/Some/any/;s/item/stuff/' file
PM 2Ring
quelle
2
Beachten Sie, dass Sie die GNU-Variante beschreiben. Die BSD-Variante (wie in FreeBSD oder OS / X) benötigt ein Argument für -i. Also sed -i '' 's/a/b/;s/c/d/' fileoder sed -i .back 's/a/b/;s/c/d/'oder sed -i.back 's/a/b/;s/c/d/'da. Andere sedImplementierungen werden im Allgemeinen nicht unterstützt -i.
Stéphane Chazelas
Vielen Dank an @ StéphaneChazelas für die Klarstellung. Und ich hätte klarer sagen sollen, dass es in GNU sed kein Leerzeichen zwischen dem -iund der Erweiterung geben kann.
PM 2Ring
sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpErgebnisse sed: -e expression #1, char 141: unterminated s "Befehl"
alhelal
@alhelal Sorry, Kommentare sind nicht der richtige Ort, um Fragen zu stellen. Trotzdem sfehlt Ihrem letzten Befehl das Finale /.
PM 2Ring
@ PM2Ring, da ich nicht bemerkt habe, dass ich vermutet habe, dass es sich um Ihre Lösung handelt. Vielen Dank jedoch.
alhelal
10

Sie können sed-Ausdrücke mit ";"

%sed -i 's/Some/any/g;s/item/stuff/g' file1
%cat file1
anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4
Ian McGowan
quelle
5

Mehrfacher Ausdruck mit mehreren -eOptionen:

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

oder Sie können nur eine verwenden:

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

Sie sollten eine Erweiterung für die Sicherungsdatei angeben, da bei einigen Implementierungen von sed, wie z. B. OSX sed, keine leere Erweiterung verwendet werden kann (Sie müssen verwenden sed -i '', um die ursprünglichen Dateien zu überschreiben).

cuonglm
quelle
1

Sie können Vim im Ex-Modus verwenden:

ex -sc '%s/Some/any/|%s/item/stuff/|x' file
  1. % Wählen Sie alle Zeilen aus

  2. s Ersatz

  3. x speichern und schließen

Steven Penny
quelle