grep -Eow '\w{10}' | grep -v '\(.\).*\1'
nie obejmuje słów, które mają dwa identyczne znaki.
grep -Eow '\w{10}' | grep -v '\(.\)\1'
nie obejmuje tych, które mają powtarzające się postacie.
POSIXly:
tr -cs '[:alnum:]_' '[\n*]' |
grep -xE '.{10}' |
grep -v '\(.\).*\1'
trumieszcza słowa we własnej linii, konwertując dowolną srówność znaków niebędących wyrazami ( cuzupełnienie znaków alfanumerycznych i podkreślników) na znak nowej linii.
Lub z jednym grep:
tr -cs '[:alnum:]_' '[\n*]' |
grep -ve '^.\{0,9\}$' -e '.\{11\}' -e '\(.\).*\1'
(z wyłączeniem wierszy zawierających mniej niż 10 i więcej niż 10 znaków oraz wiersze o znaku pojawiającym się co najmniej dwa razy).
grepTylko jeden (GNU grep z obsługą PCRE lub pcregrep):
grep -Po '\b(?:(\w)(?!\w*\1)){10}\b'
Oznacza to, że granica słowa ( \b), po której następuje sekwencja 10 znaków słów (pod warunkiem, że po każdym nie następuje sekwencja znaków słowa i samych siebie, przy użyciu operatora PCRE o przeczącej przyszłości (?!...)).
Mamy szczęście, że tutaj działa, ponieważ niewiele silników wyrażeń regularnych działa z odwołaniami wstecznymi w powtarzających się częściach.
Zauważ, że (przynajmniej z moją wersją GNU grep)
grep -Pow '(?:(\w)(?!\w*\1)){10}'
Nie działa, ale
grep -Pow '(?:(\w)(?!\w*\2)){10}'
robi (as echo aa | grep -Pw '(.)\2') co brzmi jak błąd.
Może chcesz:
grep -Po '(*UCP)\b(?:(\w)(?!\w*\1)){10}\b'
jeśli chcesz \wlub \brozważasz dowolną literę jako składnik słowa, a nie tylko ASCII w ustawieniach regionalnych innych niż ASCII.
Inna alternatywa:
grep -Po '\b(?!\w*(\w)\w*\1)\w{10}\b'
Jest to granica słów (taka, po której nie następuje ciąg znaków, z których jeden się powtarza), a następnie 10 znaków.
Rzeczy, które mogą mieć na myśli:
- W porównaniu rozróżniana jest
Babylonishwielkość liter, więc na przykład pasują, ponieważ wszystkie znaki są różne, mimo że są dwie litery Bs, jedna mała i jedna duża (użyj, -iaby to zmienić).
- o
-w, \wa \b, słowo jest literą (ASCII tylko te, dla GNU grep teraz The [:alpha:]klasa znaków w danym regionie czy korzystania -Pi (*UCP)), cyfry dziesiętne lub podkreślenia .
- oznacza to, że
c'est(dwa słowa zgodnie z francuską definicją słowa) lub it's(jedno słowo zgodnie z niektórymi angielskimi definicjami słowa) lub rendez-vous(jedno słowo zgodnie z francuską definicją słowa) nie są uważane za jedno słowo.
- Mimo to
(*UCP)znaki łączące Unicode nie są uważane za składniki słowa, więc téléphone( $'t\u00e9le\u0301phone') jest uważane za 10 znaków, z których jeden nie jest alfa. défavorisé( $'d\u00e9favorise\u0301') byłby dopasowany, mimo że ma dwa, éponieważ to 10 różnych znaków alfanumerycznych, po których następuje łączący akcent ostry (inny niż alfa, więc granica między tym ea jego akcentem jest ograniczona).