grep -Eow '\w{10}' | grep -v '\(.\).*\1'
esclude le parole che hanno due caratteri identici.
grep -Eow '\w{10}' | grep -v '\(.\)\1'
esclude quelli che hanno caratteri ripetuti.
POSIXly:
tr -cs '[:alnum:]_' '[\n*]' |
grep -xE '.{10}' |
grep -v '\(.\).*\1'
tr
mette le parole sulla propria linea convertendo qualsiasi s equazione di caratteri non di parole ( ccomplemento di caratteri alfanumerici e di sottolineatura) in un carattere di nuova riga.
O con uno grep
:
tr -cs '[:alnum:]_' '[\n*]' |
grep -ve '^.\{0,9\}$' -e '.\{11\}' -e '\(.\).*\1'
(esclude le righe di meno di 10 e più di 10 caratteri e quelle con un carattere che appare almeno due volte).
Con uno grep
solo (grep GNU con supporto PCRE o pcregrep
):
grep -Po '\b(?:(\w)(?!\w*\1)){10}\b'
Cioè, una parola limite (\b
) seguito da una sequenza di caratteri di 10 parole (a condizione che ciascuno non sia seguito da una sequenza di caratteri di parole e se stessi, usando l'operatore PCRE di look-look negativo (?!...)
).
Siamo fortunati che funzioni qui, poiché non molti motori regexp funzionano con riferimenti secondari all'interno di parti ripetute.
Nota che (almeno con la mia versione di GNU grep)
grep -Pow '(?:(\w)(?!\w*\1)){10}'
Non funziona, ma
grep -Pow '(?:(\w)(?!\w*\2)){10}'
fa (come echo aa | grep -Pw '(.)\2'
) che suona come un bug.
Potresti volere:
grep -Po '(*UCP)\b(?:(\w)(?!\w*\1)){10}\b'
se si desidera \w
o \b
considerare qualsiasi lettera come un componente word e non solo quelli ASCII in locali non ASCII.
Un'altra alternativa:
grep -Po '\b(?!\w*(\w)\w*\1)\w{10}\b'
Questo è un limite di parole (uno che non è seguito da una sequenza di caratteri di parole uno dei quali si ripete) seguito da 10 caratteri di parole.
Cose da possibilmente avere in fondo alla mente:
- Il confronto fa distinzione tra maiuscole e minuscole, quindi
Babylonish
ad esempio verrebbe abbinato, poiché tutti i caratteri sono diversi anche se ci sono due B
s, una maiuscola e una maiuscola (usare -i
per cambiarla).
- per
-w
, \w
e \b
, una parola è una lettera (quelle ASCII solo per GNU grep
per ora , la [:alpha:]
classe di caratteri nel tuo locale se usi -P
e (*UCP)
), cifre decimali o trattino basso .
- ciò significa che
c'est
(due parole secondo la definizione francese di una parola) o it's
(una parola secondo alcune definizioni inglesi di una parola) o rendez-vous
(una parola secondo la definizione francese di una parola) non sono considerate una parola.
- Anche con
(*UCP)
, Unicode che combina i caratteri non è considerato come un componente di parola, quindi téléphone
( $'t\u00e9le\u0301phone'
) è considerato come 10 caratteri, uno dei quali non alfa. défavorisé
( $'d\u00e9favorise\u0301'
) sarebbe abbinato anche se ne ha due é
perché sono 10 tutti i diversi caratteri alfa seguiti da un accento acuto combinato (non alfa, quindi c'è un confine di parole tra il e
suo accento e).