Wenn man vor der Aufgabe steht, aus einer Datei etliche Zeilen zu entfernen, die aber alle nicht gleich sind, könnte man ins Grübeln kommen. Ich stand vor dem Problem, die liste.txt immer in eine bestimmte Reihenfolgen bringen zu müssen und mit Zeilen, in denen es von Sonderzeichen nur so wimmelte. Da sowohl die auswahl.txt als auch die liste.txt Extrakte aus einer Datenbank sind, musste ich diesen Weg gehen.
Hier führen wie so oft verschiedene Wege zum Ziel.
Mit fgrep zum Beispiel:
$cat auswahl.txt Kein Zweifel Fettig 75 Rinder & können $ cat liste.txt Irgendeind Text mit allerlei sinnlosem Inhalt Nochmal gesagt: Kein Zweifel, hier ist nur Schwachsinn drin Fettig ist gar keine gute Eigenschaft für Haare 12 Schafe, 75 Rinder und 44 Ziegen Sonderzeichen wie z.B. & können hier auch drin sein Diese Zeile soll den Abschluß bilden.fgrep -f auswahl.txt liste.txt
$ fgrep -f auswahl.txt liste.txt Nochmal gesagt: Kein Zweifel, hier ist nur Schwachsinn drin Fettig ist gar keine gute Eigenschaft für Haare 12 Schafe, 75 Rinder und 44 Ziegen Sonderzeichen wie z.B. & können hier auch drin sein
Oder mit -v nur die Zeilen, die nicht in auswahl.txt stehen:
fgrep -vf auswahl.txt liste.txt
$ fgrep -vf auswahl.txt liste.txt Irgendeind Text mit allerlei sinnlosem Inhalt Diese Zeile soll den Abschluß bilden.
Das ist eigentlich trivial und wäre keinen Blog Post wert, allerdings finde ich es erwähnenswert, das man in auswahl.txt Zeichen, die normalerweise in der shell escaped werden müssen, ohne irgendwelche Skrupel unverändert eintragen kann.
Warum ist das bemerkenwert? Das ist doch genau die Aufgabe von fgrep bzw. grep --fixed-strings ...
Ich fand's eben erwähnenswert. Hatte nicht wirklich damit gerechnet. Ps: Es ist auch nicht ein (gnu)grep, sondern auf Solaris 5.10, dies kannte den Schalter -f nämlich nicht, hatte ein wenig gesucht, dann die grep Familie in xpg4 gefunden. Natürlich sieht man das auch in der man page.