grep -Eow '\w{10}' | grep -v '\(.\).*\1'
исключает слова, которые имеют два одинаковых символа.
grep -Eow '\w{10}' | grep -v '\(.\)\1'
исключая те, которые имеют повторяющиеся символы.
POSIXly:
tr -cs '[:alnum:]_' '[\n*]' |
grep -xE '.{10}' |
grep -v '\(.\).*\1'
trпомещает слова в отдельную строку, преобразовывая все sсимволы, не входящие в состав слова ( cпропуска букв, цифр и подчеркивания), в символ новой строки.
Или с одним grep:
tr -cs '[:alnum:]_' '[\n*]' |
grep -ve '^.\{0,9\}$' -e '.\{11\}' -e '\(.\).*\1'
(за исключением строк длиной менее 10 и более 10 символов, а также строк, в которых символы появляются как минимум дважды).
grepТолько с одним (GNU grep с поддержкой PCRE или pcregrep):
grep -Po '\b(?:(\w)(?!\w*\1)){10}\b'
Таким образом, за границей слова ( \b) следует последовательность из 10 символов слова (при условии, что за каждым не следует последовательность символов слова и сами по себе, используя оператор PCRE с отрицательным прогнозом (?!...)).
Нам повезло, что это работает здесь, так как не многие движки регулярных выражений работают с обратными ссылками внутри повторяющихся частей.
Обратите внимание, что (по крайней мере, с моей версией GNU grep)
grep -Pow '(?:(\w)(?!\w*\1)){10}'
Не работает, но
grep -Pow '(?:(\w)(?!\w*\2)){10}'
делает (как echo aa | grep -Pw '(.)\2'), что звучит как ошибка.
Вы можете хотеть:
grep -Po '(*UCP)\b(?:(\w)(?!\w*\1)){10}\b'
если вы хотите \wили \bсчитаете любую букву компонентом слова, а не только буквы ASCII в не-ASCII локалях.
Другая альтернатива:
grep -Po '\b(?!\w*(\w)\w*\1)\w{10}\b'
Это граница слова (за которой не следует последовательность символов слова, один из которых повторяется), за которой следуют 10 символов слова.
Вещи, которые могут быть в глубине души:
- Сравнение чувствительно к регистру, так
Babylonishчто, например, будет совпадать, так как все символы различны, даже если есть два Bs, один нижний и один верхний регистр (используйте -iдля изменения этого).
- для
-w, \wи \b, слово это буква (ASCII те только для GNU grep сейчас , то [:alpha:]класс символов в вашей местности при использовании -Pи (*UCP)), десятичных цифр или подчеркивания .
- это означает, что
c'est(два слова согласно французскому определению слова) или it's(одно слово согласно некоторым английским определениям слова) или rendez-vous(одно слово согласно французскому определению слова) не считаются одним словом.
- Даже при этом
(*UCP)символы объединения Юникод не рассматриваются как компоненты слова, поэтому téléphone( $'t\u00e9le\u0301phone') считается как 10 символов, один из которых не альфа. défavorisé( $'d\u00e9favorise\u0301') будет совпадать, даже если у него два, éпотому что это 10 разных буквенных символов, за которыми следует сочетание острого акцента (не альфа, поэтому между словом eи его акцентом есть граница слова ).