Wie kann ich eine große Anzahl verschiedener Suchen / Ersetzen durchführen?

583
ete

Ich hatte mehrmals ein Textdokument, auf das ich mehrere hundert Fundstücke / Ersetzungen anwenden muss. Diese Suchen / Ersetzen folgen keinem Muster, auf das reguläre Ausdrücke sinnvoll angewendet werden können und in der Reihenfolge angewendet werden müssen. Früher habe ich sie nach langem Suchen von Hand gemacht, aber gibt es einen besseren Weg?

0

3 Antworten auf die Frage

1
Nicole Hamilton

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- .txtDokument 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 sedSkript enthält (eine Zeile pro Änderung). Hier ist ein Beispiel. Das gEnde 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 mvSie 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, sedist in separaten Pipelinestufen. In meinem Beispiel hier habe ich die \r\nSequenzen 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 sedscriptDatei 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.

Line breaks with sed

Du verstehst es richtig. Funktioniert dies mit Tabulatoren und Zeilenumbrüchen als Teil des Suchens / Ersetzens? Und ich bin mit der Befehlszeile relativ neu / unbequem, daher würde es noch mehr helfen, wenn Sie exakte Befehle geben, die verwendet werden sollen, wenn sich die Datei, auf der die Ersetzung ausgeführt werden soll, unter C: \ Users \ Eric \ Documents \ unformatiert befindet .TXT ete vor 11 Jahren 0
Es würde mit Tabulatorzeichen in den Such- oder Ersetzungszeichenfolgen arbeiten, nicht jedoch mit eingebetteten Zeilenvorschubzeichen. (Ist das Abgleichen von Zeichenfolgen mit eingebetteten Zeilenumbrüchen eine Anforderung?) Ersetzen Sie `infile.txt 'durch Ihren tatsächlichen Pfad' C: \ Users \ Eric \ Documents \ unformatted.txt`. Nicole Hamilton vor 11 Jahren 0
Okay, das Ersetzen von Zeilenumbrüchen ist für viele der Such- / Ersetzungsvorgänge erforderlich, aber ich könnte es vielleicht mit http://www.textfixer.com/tools/remove-line-breaks.php umgehen, solange ich Zeilenumbrüche mit hinzufügen kann ein find / replace, gibt es eine Möglichkeit, dies zu tun? Und danke. ete vor 11 Jahren 0
Sind die Zeilenumbrüche darin, um den Text einfach an ein paar geeignete Ränder zu binden oder weil jede Zeile ein separater Datensatz ist? Nicole Hamilton vor 11 Jahren 0
Die zu entfernenden Zeilenumbrüche sind Teil der Formatierung, die ich entfernen möchte. Ich bin nicht sicher, was darunter fällt. ete vor 11 Jahren 0
Ich versuche zu fragen, ob die Zeilenumbrüche irgendwo zwischen Wörtern in der Suchzeichenfolge auftreten können. Wenn Sie beispielsweise nach allen Vorkommen von "Jetzt ist die Zeit" suchen, müssen Sie die Möglichkeit eines Zeilenumbruchs zwischen Wörtern in der Phrase in Betracht ziehen und alle Möglichkeiten berücksichtigen. Ich frage mich, ob es möglich wäre, Vorkommnisse zu erhalten, bei denen eine Phase unterbrochen wurde, indem einfach nach den beiden Hälften gesucht wird oder einfach alle Zeilenumbrüche durch Leerzeichen ersetzt werden, die Suche ersetzen und dann den Text einfach umbrechen. Ich weiß nicht genug darüber, wie Ihre tatsächlichen Daten aussehen. Nicole Hamilton vor 11 Jahren 0
Die Zeilenumbrüche werden zwischen konsistenten Wörtern platziert. Wenn Sie also alle Zeilenumbrüche durch eine Platzhalterzeichenfolge ersetzen, führen Sie das Suchen / Ersetzen aus (indem Sie einige der Platzhalterzeichenfolgen entfernen) und dann die Platzhalterzeichenfolge durch Zeilenumbrüche ersetzen. Ist es möglich, alle Zeilenumbrüche durch einen Platzhalter zu ersetzen? Da ich meine ursprüngliche Frage bereits vollständig beantwortet habe, hätte ich Linebreaks erwähnen sollen. ete vor 11 Jahren 0
@ete Ich habe meine Antwort überarbeitet, um neue Zeilen zu berücksichtigen. Nicole Hamilton vor 11 Jahren 0
0
Gruber

Normally programs are good at applying a single search-and-replace combination to multiple files, not the other way around.

To me it seems like your best bet is using a word processor program with macro capabilities. Then you can write a function which performs the replacing, and then call it hundred of times with your search/replace strings. Macro-enabled word processors are, for example LibreOffice Writer and Microsoft Word.

Dies scheint ein vernünftiger Ansatz zu sein, Notepad ++ (mein gewöhnlicher Texteditor) scheint die Funktionen zu haben, aber ich bin nicht sicher, wie man Zeilenumbrüche korrekt ersetzt (erweiterten Modus macht das Ersetzen von Dingen MIT Zeilenumbruch gut, aber nicht um Zeilenumbrüche zu ersetzen). . ete vor 11 Jahren 0
0
Karan

FART sollte Ihnen helfen können. Erstellen Sie einfach eine Batchdatei mit mehreren FART-Aufrufen. Wenn Sie newlines (\r\n)ersetzen möchten, aktivieren Sie die Verwendung der Syntax im C-Stil über dieParameter-Coder--c-style.