grep -Eow '\w{10}' | grep -v '\(.\).*\1'
exclut les mots qui ont deux caractères identiques.
grep -Eow '\w{10}' | grep -v '\(.\)\1'
exclut ceux qui ont des caractères répétitifs.
POSIX:
tr -cs '[:alnum:]_' '[\n*]' |
grep -xE '.{10}' |
grep -v '\(.\).*\1'
tr
place les mots sur leur propre ligne en convertissant toute séquation de caractères autres que des mots ( ccomplément alphanumérique et trait de soulignement) en caractère de nouvelle ligne.
Ou avec un grep
:
tr -cs '[:alnum:]_' '[\n*]' |
grep -ve '^.\{0,9\}$' -e '.\{11\}' -e '\(.\).*\1'
(exclure les lignes de moins de 10 et de plus de 10 caractères et celles dont le caractère apparaît au moins deux fois).
Avec un grep
seul (GNU grep avec support PCRE ou pcregrep
):
grep -Po '\b(?:(\w)(?!\w*\1)){10}\b'
C'est-à-dire, une limite de mot ( \b
) suivie d'une séquence de 10 caractères de mot (à condition que chacun ne soit pas suivi d'une séquence de caractères de mot et eux-mêmes, en utilisant l'opérateur PCRE d'anticipation négative (?!...)
).
Nous avons de la chance que cela fonctionne ici, car peu de moteurs d'expression rationnelle fonctionnent avec des références inverses à l'intérieur de parties répétitives.
Notez que (avec ma version de GNU grep au moins)
grep -Pow '(?:(\w)(?!\w*\1)){10}'
Ne fonctionne pas, mais
grep -Pow '(?:(\w)(?!\w*\2)){10}'
fait (comme echo aa | grep -Pw '(.)\2'
) ce qui ressemble à un bug.
Vous voudrez peut-être:
grep -Po '(*UCP)\b(?:(\w)(?!\w*\1)){10}\b'
si vous voulez \w
ou \b
considérez n'importe quelle lettre comme un composant de mot et pas seulement celles ASCII dans les locales non ASCII.
Une autre alternative:
grep -Po '\b(?!\w*(\w)\w*\1)\w{10}\b'
Il s'agit d'une limite de mot (celle qui n'est pas suivie d'une séquence de caractères de mot dont l'un se répète) suivie de 10 caractères de mot.
Choses à avoir éventuellement à l'esprit:
- La comparaison est sensible à la casse, donc
Babylonish
par exemple serait appariée, car tous les caractères sont différents même s'il y a deux B
s, un minuscule et un majuscule (utilisez -i
pour changer cela).
- pour
-w
, \w
et \b
, un mot est une lettre (celles ASCII uniquement pour GNU grep
pour le moment , la [:alpha:]
classe de caractères dans vos paramètres régionaux si vous utilisez -P
et (*UCP)
), des chiffres décimaux ou un trait de soulignement .
- cela signifie que
c'est
(deux mots selon la définition française d'un mot) ou it's
(un mot selon certaines définitions anglaises d'un mot) ou rendez-vous
(un mot selon la définition française d'un mot) ne sont pas considérés comme un mot.
- Même avec
(*UCP)
, les caractères de combinaison Unicode ne sont pas considérés comme des composants de mots, donc téléphone
( $'t\u00e9le\u0301phone'
) est considéré comme 10 caractères, dont un non alpha. défavorisé
( $'d\u00e9favorise\u0301'
) serait apparié même s'il y en a deux, é
car il s'agit de 10 caractères alpha différents, suivis d'un accent aigu combiné (non alpha, il y a donc une limite de mot entre le e
et son accent).