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'
tr
umieszcza 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).
grep
Tylko 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 \w
lub \b
rozważ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
Babylonish
wielkość liter, więc na przykład pasują, ponieważ wszystkie znaki są różne, mimo że są dwie litery B
s, jedna mała i jedna duża (użyj, -i
aby to zmienić).
- o
-w
, \w
a \b
, słowo jest literą (ASCII tylko te, dla GNU grep
teraz The [:alpha:]
klasa znaków w danym regionie czy korzystania -P
i (*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 e
a jego akcentem jest ograniczona).