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