grep -Eow '\w{10}' | grep -v '\(.\).*'
exclui palavras com dois caracteres idênticos.
grep -Eow '\w{10}' | grep -v '\(.\)'
exclui os que têm caracteres repetidos.
POSIXly:
tr -cs '[:alnum:]_' '[\n*]' |
grep -xE '.{10}' |
grep -v '\(.\).*'
tr
coloca palavras em sua própria linha convertendo qualquer equação de s de caracteres não-palavra ( c omplemento de alfanumérico e sublinhado) para uma nova linha personagem.
Ou com um grep
:
tr -cs '[:alnum:]_' '[\n*]' |
grep -ve '^.\{0,9\}$' -e '.\{11\}' -e '\(.\).*'
(exclua linhas com menos de 10 e mais de 10 caracteres e aquelas com um caractere aparecendo pelo menos duas vezes).
Com apenas grep
(grep do GNU com suporte a PCRE ou pcregrep
):
grep -Po '\b(?:(\w)(?!\w*)){10}\b'
Ou seja, um limite de palavra ( \b
) seguido por uma sequência de 10 caracteres de palavra (desde que cada um não seja seguido por uma seqüência de caracteres de palavra e por eles mesmos, usando o operador de look-ahead (?!...)
) .
Temos sorte de que isso funcione aqui, já que muitos mecanismos de regexp não funcionam com referências anteriores dentro de partes repetitivas.
Note que (com a minha versão do GNU grep, pelo menos)
grep -Pow '(?:(\w)(?!\w*)){10}'
Não funciona, mas
grep -Pow '(?:(\w)(?!\w*)){10}'
faz (como echo aa | grep -Pw '(.)'
) o que soa como um bug.
Você pode querer:
grep -Po '(*UCP)\b(?:(\w)(?!\w*)){10}\b'
se você quiser que \w
ou \b
considere qualquer letra como um componente de palavra e não apenas os caracteres ASCII em locais não-ASCII.
Outra alternativa:
grep -Po '\b(?!\w*(\w)\w*)\w{10}\b'
Esse é um limite de palavra (um que não é seguido por uma sequência de caracteres de palavra, um dos quais se repete) seguido por caracteres de 10 palavras.
Coisas que possivelmente podem ter no fundo da mente:
- A comparação faz distinção entre maiúsculas e minúsculas, portanto,
Babylonish
, por exemplo, corresponderia, pois todos os caracteres são diferentes, embora haja doisB
s, um inferior e um maiúsculo (use-i
para alterar isso). - para
-w
,\w
e\b
, uma palavra é uma letra (somente ASCII para GNUgrep
por enquanto , a classe de caractere[:alpha:]
em sua localidade se estiver usando-P
e(*UCP)
), dígitos decimais ou sublinhado . - significa que
c'est
(duas palavras de acordo com a definição francesa de uma palavra) ouit's
(uma palavra de acordo com algumas definições inglesas de uma palavra) ourendez-vous
(uma palavra de acordo com a definição francesa de uma palavra) não são considerados uma palavra. - Mesmo com
(*UCP)
, os caracteres combinados Unicode não são considerados como componentes de palavras, portanto,téléphone
($'t\u00e9le\u0301phone'
) é considerado como 10 caracteres, um deles não alfa.défavorisé
($'d\u00e9favorise\u0301'
) seria correspondido, embora tenha doisé
, porque são 10 caracteres alfa diferentes seguidos por um acento agudo de combinação (não alfa, portanto há um limite de palavras entre oe
e seu sotaque ).