it-swarm.com.de

Wie entferne ich Zeilen aus der Textdatei, die bestimmte Wörter enthalten?

Wie entferne ich alle Zeilen aus der Textdatei, die die Wörter "cat" und "rat" enthält?

70
PersonX

grep Ansatz

Um eine Kopie der Datei ohne Zeilen zu erstellen, die mit "cat" oder "rat" übereinstimmen, kann grep umgekehrt (-v) und mit der Ganzwortoption (-w) verwendet werden.

grep -vwE "(cat|rat)" sourcefile > destinationfile

Die Ganzwortoption stellt sicher, dass sie beispielsweise nicht mit cats oder grateful übereinstimmt. Die Ausgabeumleitung Ihrer Shell wird verwendet (>), um sie in eine neue Datei zu schreiben. Wir benötigen die Option -E, um die erweiterten regulären Ausdrücke für die Syntax (one|other) zu aktivieren.

sed Ansatz

Um die vorhandenen Zeilen zu entfernen, können Sie auch sed -i verwenden:

sed -i "/\b\(cat\|rat\)\b/d" filename

Der \b setzt Wortgrenzen und die d Operation löscht die Zeile, die dem Ausdruck zwischen den Schrägstrichen entspricht. cat und rat stimmen beide mit der (one|other) Syntax überein, die wir anscheinend mit Backslashes umgehen müssen.

Tipp: Verwenden Sie sed ohne den Operator -i, um die Ausgabe des Befehls zu testen, bevor Sie die Datei überschreiben.

(Basierend auf Sed - Eine Zeile mit einer bestimmten Zeichenfolge löschen )

95
gertvdijk

Verwenden Sie zum Testen nur im Terminal:

sed '/[cr]at/d' file_name

Um diese Zeilen wirklich aus der Datei zu entfernen, verwenden Sie:

sed -i '/[cr]at/d' file_name
15
Radu Rădeanu

Probieren Sie die vim-way:

ex +"g/[cr]at/d" -scwq file.txt
5
kenorb

Überlegen Sie, ob Sie eine Datei mit file_name haben und nach mouse suchen möchten, aber gleichzeitig nur wenige Zeilen von mouse mit anderen Wörtern wie cat und rat und Sie möchten nicht sehen die in Ihrer Ausgabe, so ist die eine Möglichkeit, es zu tun -

grep -r mouse file_name | grep -vE "(cat|rat)"
0
Indrajeet Gour

tragbare Shell Weise

Funktioniert in /bin/sh, das unter Ubuntu dash sowie ksh und bash ist. Etwas umständlich, dass Sie mehrere Testfälle für jedes Wort in der Anweisung case schreiben müssen, aber portabel. Funktioniert mit Fällen, in denen Word allein in der Zeile, am Anfang, am Ende oder in der Mitte der Zeile erscheint und ignoriert, wo es Teil eines anderen Wortes sein könnte.

#!/bin/sh
line_handler(){
   # $1 is line read, prints to stdout
    case "$1" in
        cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
        rat|rat\ *|*\ rat\ *|*\ rat) true;; 
        *) printf "%s\n" "$1"
    esac
}

readlines(){
    # $1 is input file, the rest is words we want to remove
    inputfile="$1"
    shift

    while IFS= read -r line;
    do
        line_handler "$line" "[email protected]"
    done < "$inputfile"
    [ -n "$line" ] && line_handler "$line" 
}

readlines "[email protected]"

Und so funktioniert es:

$ cat input.txt                                                                                                                                                        
the big big fat cat
the cat who likes milk 
jumped over gray rat
concat 
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt                                                                                                                                              
concat 
this is catchy
rational
irrational
0