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)символів, що поєднують Unicode, не вважаються компонентами слова, тому téléphone( $'t\u00e9le\u0301phone') вважається 10 символами, один з яких не альфа. défavorisé( $'d\u00e9favorise\u0301') буде збігатися, навіть якщо у нього є два, éтому що це 10 усіх різних символів альфа, за якими слід поєднувати гострий наголос (не-альфа, тому між словом eта його наголосом є межа слова ).