grep -Eow '\w{10}' | grep -v '\(.\).*\1'
schließt Wörter mit zwei identischen Zeichen aus.
grep -Eow '\w{10}' | grep -v '\(.\)\1'
schließt diejenigen aus, die sich wiederholende Zeichen haben.
POSIXly:
tr -cs '[:alnum:]_' '[\n*]' |
grep -xE '.{10}' |
grep -v '\(.\).*\1'
tr
sFügt Wörter in eine eigene Zeile ein, indem alle Gleichungen von Nicht-Wort-Zeichen ( cAuslassung von alphanumerischen Zeichen und Unterstrichen) in Zeilenumbrüche umgewandelt werden.
Oder mit einem grep
:
tr -cs '[:alnum:]_' '[\n*]' |
grep -ve '^.\{0,9\}$' -e '.\{11\}' -e '\(.\).*\1'
(Ausgenommen sind Zeilen mit weniger als 10 und mehr als 10 Zeichen sowie Zeilen mit mindestens zweimal vorkommenden Zeichen.)
Mit grep
nur einem (GNU grep mit PCRE-Unterstützung oder pcregrep
):
grep -Po '\b(?:(\w)(?!\w*\1)){10}\b'
Das heißt, eine Wortgrenze ( \b
) gefolgt von einer Folge von 10 Wortzeichen (vorausgesetzt, auf jedes folgt keine Folge von Wortzeichen und sich selbst, unter Verwendung des negativen Look-Ahead-PCRE-Operators (?!...)
).
Wir sind froh, dass es hier funktioniert, da nicht viele reguläre Ausdrücke mit Rückverweisen in sich wiederholenden Teilen arbeiten.
Beachten Sie, dass (mit meiner Version von GNU grep mindestens)
grep -Pow '(?:(\w)(?!\w*\1)){10}'
Funktioniert nicht, aber
grep -Pow '(?:(\w)(?!\w*\2)){10}'
does (as echo aa | grep -Pw '(.)\2'
) was wie ein Bug klingt.
Du möchtest vielleicht:
grep -Po '(*UCP)\b(?:(\w)(?!\w*\1)){10}\b'
wenn Sie wollen , \w
oder einen \b
beliebigen Buchstaben als Wortbestandteil zu betrachten und nicht nur die ASCII diejenigen in Nicht-ASCII - locales.
Eine andere Alternative:
grep -Po '\b(?!\w*(\w)\w*\1)\w{10}\b'
Dies ist eine Wortgrenze (eine, auf die keine Folge von Wortzeichen folgt, von denen sich eines wiederholt), gefolgt von 10 Wortzeichen.
Dinge, die man möglicherweise im Hinterkopf haben sollte:
- Der Vergleich unterscheidet zwischen Groß- und Kleinschreibung, so dass
Babylonish
zum Beispiel eine Übereinstimmung erzielt wird, da alle Zeichen unterschiedlich sind, obwohl es zwei B
s gibt, einen Kleinbuchstaben und einen Großbuchstaben ( -i
zum Ändern verwenden).
- für
-w
, \w
und \b
, ist ein Wort , einen Buchstabe (ASCII diejenigen nur für GNU grep
für jetzt , die [:alpha:]
Zeichenklasse in Ihrem Gebietsschema bei Verwendung von -P
und (*UCP)
), Dezimalstellen oder Unterstrich .
- das bedeutet, dass
c'est
(zwei Wörter gemäß der französischen Definition eines Wortes) oder it's
(ein Wort gemäß einigen englischen Definitionen eines Wortes) oder rendez-vous
(ein Wort gemäß der französischen Definition eines Wortes) nicht als ein Wort betrachtet werden.
- Auch
(*UCP)
wenn Unicode-Kombinationszeichen nicht als Wortbestandteile betrachtet werden, wird téléphone
( $'t\u00e9le\u0301phone'
) als 10 Zeichen betrachtet, von denen eines kein Alpha ist. défavorisé
( $'d\u00e9favorise\u0301'
) würde übereinstimmen, obwohl es zwei é
Zeichen hat, da dies 10 verschiedene Alpha-Zeichen sind, gefolgt von einem kombinierten Akzent (kein Alpha, daher gibt es eine Wortgrenze zwischen dem e
und seinem Akzent).