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.

Chrom
quelle

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
paxdiablo
quelle
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.
Rick
quelle
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?

rauben
quelle
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.

Mirod
quelle