Wie verwende ich egrep um die Liste der Wörter, die übereinstimmung mit einem regulären Ausdruck?
Muss ich verwenden Sie egrep um die Anzahl der Wörter, die strings enthalten, die mit einem regulären Ausdruck. Zum Beispiel, ich muss etwas tun, wie "Zählen Sie die Anzahl der Wörter mit drei aufeinanderfolgenden vokalen" (nicht genau, aber das ist der Kern von ihm).
Ich habe herausgefunden wie es Zeilen, die enthalten diese Worte, aber wenn ich das -w-tag ich bekomme ein egrep: illegal option -- w
Fehler.
Hier ist der reguläre Ausdruck, den ich verwenden würde, um die Zeilen in dem oben beschriebenen Szenario, das scheint zu funktionieren:
egrep -i -c '[aeiou][aeiou][aeiou]' full.html
Mithilfe der -w
tag mit diesem Befehl verursacht die Fehler, die ich oben aufgeführt, auch wenn ich hinzufügen \b-tags um das regex-Ausdruck. z.B.:
egrep -i -c -w '\b.*[aeiou][aeiou][aeiou].*\b' full.html
Was mache ich falsch?
EDIT: bei mir läuft dies unter Solaris 10 aus dem terminal.
- Ich weiß nicht, aber
[a|e|i|o|u]{3}
wäre leichter zu Lesen - Keine Notwendigkeit für die Rohre in Charakter-Klassen, verwenden Sie einfach
[aeiou]{3}
. - Ich habe bearbeitet meine post, um es einfacher zu Lesen.
- Hinzufügen der
{3}
- tag bewirkt, dass meine Befehle zurück, zählt von 0 an. Wieder hab ich, läuft dies unter Solaris 10, nicht Linux oder Unix.
Du musst angemeldet sein, um einen Kommentar abzugeben.
nutzen Sie diesen Weg auch zu finden die Anzahl der Wörter, die strings enthält,
grep --color -Eow '[aeiou][aeiou][aeiou]' filename | wc -l
oder
egrep -ow '[aeiou][aeiou][aeiou]' filename | wc -l
o für das Drucken nur abgestimmt.
w für word.
schließlich, es zeigt die Anzahl des Wortes.
grep -o -c
für Sie arbeitet, ist es vorzuziehen, umgrep -o | wc -l
aber zumindest GNUgrep
hatte einen langjährigen Fehler für diese option Kombination. Ich glaube, es sollte behoben werden, die in den GNU Coreutils 8.x.Müssen Sie bitte mit Ihrem solaris man-pages zu wissen, wenn Ihr egrep unterstützt alle/alle/einige der GNU-Erweiterungen wie.
Ist das system /usr/xpg4/bin ? Wenn ja, stellen Sie sicher, dass Ihre MANPATH enthält /usr/xpg4/Mann. Dass dir verwendet werden, um die neuesten Versionen, kurz, etwas wie /opt/gnu installieren, Hinzugefügt.
In jedem Fall, regexp
'\b.*[aeiou][aeiou][aeiou].*\b'
liest in meinem Auge, als ...Wahrscheinlich nicht das, was Sie wirklich wollen.
Um Ihren Bedarf zu erfüllen Wörter mit 3 vokalen in einer Zeile, und verwenden alte/Platz reg-ex lange Seite, versuchen
Sagt, passen Zeichen [a-z] eine beliebige Anzahl (einschließlich keiner), vor 3 Vokale, gefolgt von einer beliebigen Anzahl von Zeichen [a-z] (einschließlich keine). Also Platz chars übereinstimmen, wird nicht [a-z]. Du bist über -ich zu groß - /Kleinschreibung ignorieren, so dass Sie nicht haben, um zu verwenden
[A-Za-z]
. Offensichtlich, wenn Sie andere chars, die Sie wollen zu prüfen, wie word chars, vielleicht sind die'_'
char?, hinzufügen, dass zu beiden Seiten.Sorry, aber ich werde aus dem Gedächtnis hier, ich arbeite nicht in einer Solaris-shop, und kann das nicht testen es gibt.
Bearbeiten
Beachten Sie auch, dass die man-Seite auf meinem aktuellen system für grep, sagt
Hinweis: es wird die Anzahl der übereinstimmenden Zeilen, nicht die Anzahl der Treffer.
Möglicherweise einfacher zu verwenden
IHTH
\b
wird das tag verwendet, um zu definieren, Wort-Grenzen, ähnlich wie\<
und\>
im vim. Ich habe immer noch nicht das problem gelöst. Vielleicht haben einfach zu verwenden awk.Ich glaube, daß egrep nicht unterstützen
\b
für Wortgrenzen. Versuchen\<
für den Beginn von Wort-Grenze und\>
für Ende des Wort-Grenze.BEARBEITEN
Hmm... never mind. Nach der Mann Seite
\b
unterstützt wird.Eigentlich, denke ich, die Antwort ist, dass nur grep unterstützt die "-w" option. Ich glaube nicht, dass egrep tut.
http://ss64.com/bash/egrep.html
Welche Plattform und welche version von egrep?
Die option-w funktioniert bei mir (CentOS und Mac mit GNU-egrep) - siehe unten. Auch
\b
funktioniert wie erwartet - siehe unten.Außerdem habe ich eine andere regex - siehe unten.
pkginfo -l SUNWcsu | grep "VERS"
gibt mir ein Ergebnis vonVERSION: 11.10.0,REV=2005.01.21.16.34
egrep -i '\b[aeiou]{3}\b' test.txt
-w
tag mit\b
im regex-Ausdruck. Ich habe sogar versucht\<
. Das ist langsam frustrierend. Ich verstehe nicht, warum die gleichen Befehle, die die Arbeit nicht, die hier arbeiten.grep -o
druckt jedes einzelne Spiel auf einer separaten Zeile. Wenn es mehrere Spiele in der gleichen Zeile, druckt er jede auf einer separaten line-Ausgang.