grep -Eow '\w{10}' | grep -v '\(.\).*\1'
exclui palavras que possuem dois caracteres idênticos.
grep -Eow '\w{10}' | grep -v '\(.\)\1'
exclui aqueles que têm caracteres repetidos.
POSIXly:
tr -cs '[:alnum:]_' '[\n*]' |
grep -xE '.{10}' |
grep -v '\(.\).*\1'
tr
coloca as palavras em sua própria linha, convertendo qualquer sequivalência de caracteres que não sejam palavras ( complemento de alfanumérico e sublinhado) em um caractere de nova linha.
Ou com um grep
:
tr -cs '[:alnum:]_' '[\n*]' |
grep -ve '^.\{0,9\}$' -e '.\{11\}' -e '\(.\).*\1'
(exclua linhas com menos de 10 e mais de 10 caracteres e aquelas com um caractere aparecendo pelo menos duas vezes).
Com grep
apenas um (GNU grep com suporte para PCRE ou pcregrep
):
grep -Po '\b(?:(\w)(?!\w*\1)){10}\b'
Ou seja, um limite de palavras ( \b
) seguido por uma sequência de 10 caracteres de palavras (desde que cada um não seja seguido por uma sequência de caracteres de palavras e por si mesmos, usando o operador PCRE negativo antecipado (?!...)
).
Temos sorte que ele funcione aqui, já que muitos mecanismos de regexp não funcionam com referências anteriores em peças repetidas.
Note que (com minha versão do GNU grep pelo menos)
grep -Pow '(?:(\w)(?!\w*\1)){10}'
Não funciona, mas
grep -Pow '(?:(\w)(?!\w*\2)){10}'
faz (as echo aa | grep -Pw '(.)\2'
) que soa como um bug.
Você pode querer:
grep -Po '(*UCP)\b(?:(\w)(?!\w*\1)){10}\b'
se você quiser \w
ou \b
considerar qualquer letra como um componente de palavra e não apenas as letras ASCII em códigos de idioma não ASCII.
Outra alternativa:
grep -Po '\b(?!\w*(\w)\w*\1)\w{10}\b'
Esse é um limite de palavras (aquele que não é seguido por uma sequência de caracteres de palavras, uma das quais se repete), seguido por 10 caracteres de palavras.
Coisas que você pode ter no fundo da mente:
- A comparação faz
Babylonish
distinção entre maiúsculas e minúsculas, portanto, por exemplo, haveria correspondência, pois todos os caracteres são diferentes, mesmo que existam dois B
s, um menor e outro maiúsculo (use -i
para mudar isso).
- para
-w
, \w
e \b
, uma palavra é uma letra (ASCII apenas para GNU grep
por enquanto , a [:alpha:]
classe de caracteres em sua localidade, se estiver usando -P
e (*UCP)
), dígitos decimais ou sublinhado .
- isso significa que
c'est
(duas palavras conforme a definição francesa de uma palavra) ou it's
(uma palavra de acordo com algumas definições em inglês de uma palavra) ou rendez-vous
(uma palavra conforme a definição de palavra francesa) não são consideradas uma palavra.
- Mesmo com a
(*UCP)
combinação de caracteres Unicode, não são considerados componentes de palavras, portanto téléphone
( $'t\u00e9le\u0301phone'
) é considerado com 10 caracteres, um dos quais não alfa. défavorisé
( $'d\u00e9favorise\u0301'
) seria correspondido mesmo que tenha dois, é
porque são 10 caracteres alfa diferentes, seguidos por um sotaque agudo combinado (não alfa, portanto, há um limite de palavras entre o e
e o sotaque).