Suchen nach Wörtern mit bestimmten Merkmalen in einer Wörterbuchdatei

Suchen nach Wörtern mit bestimmten Merkmalen in einer Wörterbuchdatei

Suchen Sie in einer Textdatei nach Wörtern, die mit boder beginnen, enden und ein „ oder“ oenthalten .ig

In das Terminal muss ein Befehl eingegeben werden, der ein Wort mit den oben beschriebenen Spezifikationen anzeigt.

Ich habe Folgendes verwendet, aber es bleibt nicht bei einem Wort und enthält Leerzeichen:

~$  egrep -n '\bb.*(i|g).*o\b'

Ich verwende Linux Ubuntu und bin mir nicht sicher, wie ich die Anweisung ausführen soll. Ich habe mehrere Anweisungen ausprobiert, alle fehlgeschlagen. Kann mir jemand helfen, die Regex-Anweisung zu entschlüsseln, da ich damit so große Schwierigkeiten habe?

Ein Beispiel: Angenommen, ich habe die folgenden zufälligen Wörter in einer Textdatei:

boo djhg
bio jdjjf
dgdhd bgo
ghhh

Dann müssen die Wörter „boo“, „bio“ und „bgo“ hervorgehoben werden.

Antwort1

Der gesuchte Befehl ist grepund der gewünschte reguläre Ausdruck ist b[[:alnum:]]*[ig][[:alnum:]]*o.

  • [[:alnum:]]entspricht einem einzelnen alphanumerischen Zeichen.
  • *stimmt mit jeder Zahl (einschließlich Null) des vorherigen Ausdrucks überein.
  • [ig]iwird mit einem einzelnen oder übereinstimmen g.
  • Alle anderen Zeichen ( bund o) in diesem bestimmten regulären Ausdruck stimmen mit sich selbst überein.

Durch die Verwendung von [[:alnum::]]*„anstatt“ .*wird die Übereinstimmung von Wörtern vermieden, die Leerzeichen enthalten.

grepwird verwendet wie

grep OPTIONS 'EXPRESSION' INPUT-FILES

und gibt die Zeilen entsprechend EXPRESSIONseiner Standardausgabe aus (in diesem Fall dem Terminal).

In diesem Fall sollten Sie die Optionen -wund verwenden -o, die den Ausdruck zwingen, Wörter (Zeichenfolgen, die von Nicht-Wort-Zeichen umgeben sind) abzugleichen und nur die übereinstimmenden Daten (nicht die ganze Zeile) zurückzugeben.

$ grep -w -o 'b[[:alnum:]]*[ig][[:alnum:]]*o' words
bio
bgo

Sie haben erwähnt, dass SieMarkierendie übereinstimmenden Wörter. Das ist etwas, was GNU grepkann. Ich lasse -ohier die Option weg, die ganze Zeile jeder Übereinstimmung zu erhalten, sonst erhalten Sie nur dasselbe Ergebnis wie zuvor, nur hervorgehoben, was langweilig wäre.

$ grep --color -w 'b[[:alnum:]]*[ig][[:alnum:]]*o' Wörter
BiografieAbonnieren
dgdhdbgo

Wie Sie sehen, werden hier nur die Übereinstimmungen in Zeilen angezeigt, die Übereinstimmungen enthalten. Um die vollständige Eingabe (auch Zeilen ohne Übereinstimmung) mit hervorgehobenen Übereinstimmungen anzuzeigen, müssen wir die -wOption löschen und Folgendes tun:

$ grep --color -E '\bb[[:alnum:]]*[ig][[:alnum:]]*o\b|$' Wörter
buuh, djhg
BiografieAbonnieren
dgdhdbgo
ghhh

Wir mussten die -EOption hinzufügen, da |es sich um einen erweiterten regulären Ausdruck handelt. Er \bpasst an jede Wortgrenze.

Antwort2

Ich würde grepFolgendes verwenden:

egrep -i "^b.*(i|g)+.*o$" /usr/share/dict/words
  • ^bbeginnt mit "b"
  • .*alles jederzeit
  • (i|g)*"i" oder "g" ein- oder mehrmals
  • o$endet mit "o"

Antwort3

set -f; for w in `cat /usr/share/dict/words`; do
   case $w in b*[ig]*o ) echo "$w" ;; esac
done
# you could as well say: $(< /usr/share/dict/words) in place of the backquoted cat.
# if your version of bash supports it.

Wir teilen die Wörterdatei in Wörter auf $wund führen anschließend eine Platzhalterprüfung durch.

  • Das Platzhaltermuster ist: b*[ig]*o, was wie folgt zu lesen ist:
  • $w muss mit dem Buchstaben „b“ beginnen.
  • $w muss mit dem Buchstaben „o“ enden.
  • $w muss irgendwo dazwischen entweder ein "i" oder ein "g" enthalten, damit es übereinstimmt
  • Bei einer erfolgreichen Übereinstimmung zeigen wir das Wort an.

verwandte Informationen