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
что, например, будет совпадать, так как все символы различны, даже если есть два B
s, один нижний и один верхний регистр (используйте -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
и его акцентом есть граница слова ).