grep -Eow '\w{10}' | grep -v '\(.\).*\1'
excluye palabras que tienen dos caracteres idénticos.
grep -Eow '\w{10}' | grep -v '\(.\)\1'
excluye los que tienen caracteres repetidos.
POSIXY:
tr -cs '[:alnum:]_' '[\n*]' |
grep -xE '.{10}' |
grep -v '\(.\).*\1'
tr
coloca las palabras en su propia línea al convertir cualquier ssecuencia de caracteres que no sean palabras ( ccomplemento de alfanumérico y guión bajo) en un carácter de nueva línea.
O con uno grep
:
tr -cs '[:alnum:]_' '[\n*]' |
grep -ve '^.\{0,9\}$' -e '.\{11\}' -e '\(.\).*\1'
(excluya líneas de menos de 10 y más de 10 caracteres y aquellas con un carácter que aparezca al menos dos veces).
Con uno grep
solo (GNU grep con soporte PCRE o pcregrep
):
grep -Po '\b(?:(\w)(?!\w*\1)){10}\b'
Es decir, un límite de palabra ( \b
) seguido de una secuencia de 10 caracteres de palabra (siempre que cada uno no sea seguido por una secuencia de caracteres de palabra y ellos mismos, utilizando el operador PCRE de vista previa negativo (?!...)
).
Tenemos suerte de que funcione aquí, ya que no muchos motores regexp funcionan con referencias inversas dentro de las partes repetidas.
Tenga en cuenta que (con mi versión de GNU grep al menos)
grep -Pow '(?:(\w)(?!\w*\1)){10}'
No funciona pero
grep -Pow '(?:(\w)(?!\w*\2)){10}'
does (as echo aa | grep -Pw '(.)\2'
) que suena como un error.
Es posible que desee:
grep -Po '(*UCP)\b(?:(\w)(?!\w*\1)){10}\b'
si desea \w
o \b
considerar cualquier letra como un componente de palabra y no solo las ASCII en configuraciones regionales no ASCII.
Otra alternativa:
grep -Po '\b(?!\w*(\w)\w*\1)\w{10}\b'
Ese es un límite de palabras (uno que no es seguido por una secuencia de caracteres de palabras, una de las cuales se repite) seguido de 10 caracteres de palabras.
Cosas que posiblemente tenga en mente:
- La comparación
Babylonish
distingue entre mayúsculas y minúsculas, por lo que, por ejemplo, coincidiría, ya que todos los caracteres son diferentes a pesar de que hay dos B
s, una minúscula y una mayúscula (use -i
para cambiar eso).
- para
-w
, \w
y \b
, una palabra es una letra (ASCII solo para GNU grep
por ahora , la [:alpha:]
clase de caracteres en su localidad si usa -P
y (*UCP)
), dígitos decimales o guiones bajos .
- eso significa que
c'est
(dos palabras según la definición francesa de una palabra) o it's
(una palabra según algunas definiciones inglesas de una palabra) o rendez-vous
(una palabra según la definición francesa de una palabra) no se consideran una palabra.
- Incluso con
(*UCP)
, los caracteres de combinación Unicode no se consideran componentes de palabras, por lo que téléphone
( $'t\u00e9le\u0301phone'
) se considera como 10 caracteres, uno de los cuales no es alfa. défavorisé
( $'d\u00e9favorise\u0301'
) coincidiría aunque tenga dos é
porque son 10 caracteres alfabéticos diferentes seguidos de una combinación de acento agudo (no alfa, por lo que hay un límite de palabras entre el e
y su acento).