Wie drucke ich Zeilen, die nur Zeichen aus einer Liste in BASH enthalten?

7

Ich habe eine Datei namens "dictionary.txt", die eine Liste aller möglichen Wörter enthält, z. B .:

%Vor%

Wie kann ich das suchen, nur Zeilen, die Buchstaben aus einer begrenzten Liste enthalten, zB wenn die Liste die Buchstaben "c", "a" und "t" enthält, wird eine Suche diese Wörter aufdecken:

%Vor%

Wenn die Buchstaben "e", "a" und "t" durchsucht werden, werden nur diese Wörter aus "dictionary.txt" gefunden:

%Vor%

Die einzige Lösung, die ich geschafft habe, ist diese:

  • Erstellen Sie eine Liste aller möglichen Buchstaben.
  • Lösche die gesuchten Buchstaben aus dieser Liste und hinterlasse eine Liste mit Buchstaben, nach denen ich nicht suchen möchte.
  • Löschen Sie alle Zeilen aus dem Wörterbuch, das diese Buchstaben enthält, mit einer for-Schleife, die jeden dieser Buchstaben zyklisch abruft.
  • Drucken Sie die restlichen Wörter im Wörterbuch.

Diese Lösung ist sehr langsam. Außerdem muss ich diesen Code mit anderen Sprachen verwenden, die Tausende von möglichen Zeichen haben, so dass diese Suchmethode besonders langsam ist.

Wie kann ich nur die Zeilen aus "dictionary.txt" drucken, die nur die gesuchten Buchstaben enthalten, und sonst nichts?

    
Village 19.05.2014, 14:32
quelle

5 Antworten

18
%Vor%

Erläuterung:

^ = marker bedeutet Anfang der Zeile

$ = Markierung bedeutet Ende der Zeile

[abc] = Zeichenklasse ("irgendeines dieser Zeichen")

* = Multiplikator für die Zeichenklasse (null oder mehr Wiederholungen)

    
amphetamachine 19.05.2014, 14:36
quelle
8

Leider kann ich nichts sagen, sonst würde ich die Antwort von Amphetamachine hinzufügen . Wie auch immer, mit der aktualisierten Bedingung von Tausenden von Suchzeichen möchten Sie vielleicht Folgendes tun:

%Vor%

wo patterns.txt ist deine Regexp:

%Vor%

Im Folgenden finden Sie eine Beispielsitzung:

%Vor%

Auf diese Weise werden Sie nicht durch die Shell eingeschränkt (Argumentliste zu lang). Sie können auch mehrere Muster in der Datei angeben:

%Vor%     
galaxy 02.06.2014 15:25
quelle
6

Versuchen Sie es mit awk :

%Vor%

Ich fand, dass dies für mehr als etwa sieben Buchstaben mindestens eine Größenordnung schneller ist als grep. Ich weiß jedoch nicht, ob Sie mit Tausenden von Buchstaben auf dasselbe Problem stoßen werden, da ich nicht so viele getestet habe.

Sie können sogar mehrere Muster gleichzeitig suchen (dies ist schneller als jedes Muster einzeln zu durchsuchen, da die Wörterbuchdatei nur einmal gelesen wird). Jedes Muster verhält sich wie eine if-Anweisung:

%Vor%     
savanto 30.05.2014 17:22
quelle
5
%Vor%

Verwenden Sie dies für den Buchstaben, den Sie finden müssen. Wenn Sie mehr als einen Buchstaben zusammen finden möchten, wiederholen Sie einfach den Befehl.

Grep sollte auch nicht für mehr als die einfachsten / elementaren Suchen verwendet werden, IMHO. Obwohl ich normalerweise zögere, irgendwelche POSIX-Dienstprogramme als veraltet zu bezeichnen, versuche ich grep zu vermeiden. Seine Syntax ist extrem inkonsistent.

Das Studium dieser Textdatei wird ebenfalls empfohlen. Ссылка

    
petrus4 02.06.2014 22:06
quelle
1

Wenn Sie z.B. Umlaute im Muster und nicht die anderen Akzente haben wollen, setze LC_ALL="C" vor der Ausführung von grep.

Dies z.B. gibt Ihnen nur die deutschen Kandidatenwörter in einer möglichen dictionary.txt-Datei.

%Vor%     
tak 08.08.2017 15:48
quelle

Tags und Links