Suchen Sie in einer Textdatei nach Wörtern, die mit b
oder beginnen, enden und ein „ oder“ o
enthalten .i
g
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 grep
und 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]
i
wird mit einem einzelnen oder übereinstimmeng
.- Alle anderen Zeichen (
b
undo
) 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.
grep
wird verwendet wie
grep OPTIONS 'EXPRESSION' INPUT-FILES
und gibt die Zeilen entsprechend EXPRESSION
seiner Standardausgabe aus (in diesem Fall dem Terminal).
In diesem Fall sollten Sie die Optionen -w
und 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 grep
kann. Ich lasse -o
hier 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 -w
Option löschen und Folgendes tun:
$ grep --color -E '\bb[[:alnum:]]*[ig][[:alnum:]]*o\b|$' Wörter buuh, djhg BiografieAbonnieren dgdhdbgo ghhh
Wir mussten die -E
Option hinzufügen, da |
es sich um einen erweiterten regulären Ausdruck handelt. Er \b
passt an jede Wortgrenze.
Antwort2
Ich würde grep
Folgendes verwenden:
egrep -i "^b.*(i|g)+.*o$" /usr/share/dict/words
^b
beginnt mit "b".*
alles jederzeit(i|g)*
"i" oder "g" ein- oder mehrmalso$
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 $w
und 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.