Bitte korrigieren Sie mich, wenn ich Ihre Frage falsch verstanden habe, aber aus Ihrer Beschreibung gehe ich davon aus, dass Sie ein einziges (möglicherweise sehr großes) Ascii- .txt
Dokument haben und dass, wenn Sie sagen, dass die Änderungen "in der Reihenfolge" angewendet werden müssen, Sie "" Ich möchte die erste Suche / Ersetzung für das gesamte Dokument durchführen, dann die zweite Suche / Ersetzung für das gesamte Dokument und so weiter.
Die einfachste Lösung wäre die Erstellung einer Datei (Aufruf sedscript
), die ein sed
Skript enthält (eine Zeile pro Änderung). Hier ist ein Beispiel. Das g
Ende bedeutet "global", dh es werden alle Vorkommen ersetzt, nicht nur das erste Vorkommen in einer bestimmten Zeile.
s/foo/bar/g s/hello/world/g s/yellow/green/g :
Sie können dies dann wie folgt ausführen:
sed -f sedscript infile.txt > outfile.txt
Wenn Sie mit der Ausgabe zufrieden sind, legen mv
Sie sie einfach über die Eingabe zurück:
mv outfile.txt infile.txt
Wenn Sie sich auf einer Linux-Maschine befinden, wird dies mitgeliefert sed
. Wenn Sie unter Windows arbeiten, können Sie sed
(und mv
) entweder mit Cygwin oder meiner eigenen Hamilton C-Shell (einschließlich der kostenlosen Version ).
Hinzugefügt:
Da Sie auch Übereinstimmungen in Betracht ziehen möchten, an denen die Spannenlinie endet, besteht eine Möglichkeit dazu darin, alle Zeilenenden durch ein Sonderzeichen oder eine Zeichenfolge zu ersetzen, die gewünschten Such- / Ersetzungsoperationen auszuführen und dann die Zeilenenden zu setzen zurück, wenn du fertig bist.
Die einfachste Möglichkeit, die Konvertierung von Zeilenenden durchzuführen, sed
ist in separaten Pipelinestufen. In meinem Beispiel hier habe ich die \r\n
Sequenzen durch eine ersetzt #
, könnte aber eine völlig beliebige Zeichenfolge sein (es ist jedoch einfacher, wenn Sie ein einzelnes Zeichen verwenden können.)
sed 's/\r\n/#/' infile.txt | s -f sedscript | sed 's/#/\r\n/g' > outfile.txt
In Ihrer sedscript
Datei würden Sie dann nach beiden Varianten suchen / ersetzen, mit einem Leerzeichen zwischen den Wörtern oder was auch immer Sie sie ersetzt haben.
Wenn Sie nur ein einzelnes Zeichen verwenden können und keine Mehrzeichenzeichenfolge benötigen, um die Eindeutigkeit zu gewährleisten, können Sie \(...\)
Notation verwenden, um einen markierten regulären Ausdruck um eine [...]
Liste von Zeichen zu erstellen, die ein Wort trennen. Was auch immer übereinstimmt, kann in den Ersetzungsstring als eingefügt werden \1
.
Hier ist ein Screenshot, wie das funktionieren könnte.