Löschen Sie bestimmte Zeilen in einer txt-Datei über eine Batch-Datei


75

Ich habe eine generierte txt-Datei. Diese Datei enthält bestimmte Zeilen, die überflüssig sind und entfernt werden müssen. Jede Zeile, die entfernt werden muss, enthält eine von zwei Zeichenfolgen in der Zeile. "ERROR" oder "REFERENCE". Diese Token können an einer beliebigen Stelle in der Zeile angezeigt werden. Ich möchte diese Zeilen löschen und dabei alle anderen Zeilen beibehalten.

Also, wenn die txt-Datei so aussieht:

Gute Datenreihe
fehlerhafte Zeile von C: \ Directory \ ERROR \ myFile.dll
Eine weitere gute Datenzeile
schlechte Linie: REFERENZ 
Gute Linie

Ich möchte, dass die Datei so endet:

Gute Datenreihe
Eine weitere gute Datenzeile
Gute Linie

TIA.

Antworten:


106

Verwenden Sie Folgendes:

type file.txt | findstr /v ERROR | findstr /v REFERENCE

Dies hat den Vorteil, dass Standardtools unter Windows verwendet werden, anstatt sed / awk / perl und dergleichen suchen und installieren zu müssen.

Siehe das folgende Transkript dafür in Betrieb:

C: \> Geben Sie file.txt ein
Gute Datenreihe
fehlerhafte Zeile von C: \ Directory \ ERROR \ myFile.dll
Eine weitere gute Datenzeile
schlechte Linie: REFERENZ
Gute Linie

C: \> Geben Sie file.txt | ein findstr / v FEHLER | findstr / v REFERENZ
Gute Datenreihe
Eine weitere gute Datenzeile
Gute Linie

1
Großartig, genau die Linie, nach der ich gesucht habe.
Chrom

5
Hatte genau dieses Problem und fand es hier auf SO. Gott segne den Stapelüberlauf !!
Matt Rogish

22
Um vollständig zu sein: Sie müssen "> output.txt" (ohne Anführungszeichen) hinzufügen, damit die Ausgabe in eine Datei geschrieben wird.
Burkhard

Danke, das war schnell und einfach so wie ich es mag!
Kuberchaun

2
danke, das hat mir geholfen, aber ein Wort der Vorsicht, ich hatte einige Probleme mit Phrasen einschließlich Leerzeichen und musste / c: verwenden, damit der Befehl folgendermaßen aussehen würde: Geben Sie file.txt | ein findstr / v / c: "FEHLER" | findstr / v / c: "REFERENZ". Wenn Sie Linien entfernen müssen, von denen Sie wissen, dass sie sich oben in der Datei befinden, leiten Sie sie durch mehr + <n>, wobei <n> die Anzahl der zu streifenden Linien ist.
Apeiron

45

Sie können die gleiche Lösung wie bei @ paxdiablo mit nur findstr selbst erreichen. Es ist nicht erforderlich, mehrere Befehle zusammen zu leiten:

findstr /V "ERROR REFERENCE" infile.txt > outfile.txt

Details dazu:

  • / v findet Zeilen, die nicht mit der Suchzeichenfolge übereinstimmen (derselbe Schalter, den @paxdiablo verwendet)
  • Wenn die Suchzeichenfolge in Anführungszeichen steht, führt sie eine ODER-Suche mit jedem Wort durch (Trennzeichen ist ein Leerzeichen).
  • findstr kann eine Eingabedatei aufnehmen, Sie müssen den Text nicht mit dem Befehl "type" eingeben
  • "> outfile.txt" sendet die Ergebnisse an die Datei outfile.txt und druckt sie stattdessen auf Ihre Konsole. (Beachten Sie, dass die Datei überschrieben wird, wenn sie vorhanden ist. Verwenden Sie stattdessen ">> outfile.txt", wenn Sie sie anhängen möchten.)
  • Sie können auch den Schalter / i hinzufügen, um eine Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung zu erzielen.

Typ! INSTALLED_APPS! | findstr / v "@ //"> temp_filter_out_junk.txt> nul 2> & 1
Mike Q

Ich habe es versucht, type D:/e5/datastream/package.json | findstr /v eikon-framework | findstr /v df-coreaber es löscht nicht die Zeilen
Kittu

Ich habe versucht, findstr / V "eikon-framework df-core" D: \ e5 \ datastream \ package.json> D: \ e5 \ datastream \ package.json zu finden, aber es löscht den gesamten Inhalt, wenn ich versuche, die Daten in derselben Datei zu ersetzen und wenn ich einen anderen Ausgabedateinamen verwende, funktioniert es. Wie aktualisiere ich dieselbe Datei?
Kittu

@kittu Verwenden Sie ">>" anstelle von ">". Aus der Antwort: Verwenden Sie stattdessen ">> outfile.txt", wenn Sie anhängen möchten. Sie können nicht dieselbe Datei in diesem einzelnen Befehl ändern.
Rick

6

Wenn Sie sediert haben:

sed -e '/REFERENCE/d' -e '/ERROR/d' [FILENAME]

Wo FILENAMEist der Name der Textdatei mit den guten und schlechten Zeilen?


1
Benötigen Sie die -iFlagge nicht?
Prosoitos

1

Wenn Sie Perl installiert haben, perl -i -n -e"print unless m{(ERROR|REFERENCE)}"sollten Sie den Trick tun.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.