Следующее соответствует любому «слову» в начале строки, состоящей только из 3 одинаковых [ :альфа :] символов:
grep -i '^\([[:alpha:]]\)\1\1\b'
Или с опциями grep-E
(--extended-regexp
)или -P
(, также известными как--perl-regexp
):
grep -iE '^([[:alpha:]])\1\1\b'
grep -iP '^([[:alpha:]])\1\1\b'
Они работают с GNU grep и (, за исключением версии -P
)с grep FreeBSD. Они могут не работать с другими версиями grep.
Если вы хотите сопоставить слова любой длины, содержащие 3 или более одинаковых буквенных символов в любом месте, это немного сложнее. Вам нужно использовать отрицательный просмотр вперед , который требует Perl-совместимых регулярных выражений.
т. е. это нельзя сделать сgrep -E
(ака egrep
, который устарел).
Например:
$ grep -iP '^[[:alpha:]]*([[:alpha:]])((?:(?!\1)[[:alpha:]])*\1){2}[[:alpha:]]*\b' /usr/share/dict/words
Aaliyah
Aaliyah's
Aarau
Aargau
Aaronical
Abadan
Abbottstown
Abbottstown's
Aberdeen
Aberdeen's
...
zoozoo
zoozoos
zuzzes
zwitterionic
zygogeneses
zygomorphous
zymogeneses
zyzzyva
zyzzyvas
zzz
(согласно wc -l
, это соответствует 67117 из 344817 слов в моем файле /usr/share/dict/words)
И, наконец, сопоставлять только слова с ровно 3 одинаковых [ :альфа :] где-либо внутри них:
$ grep -iP '^[[:alpha:]]*([[:alpha:]])((?:(?!\1)[[:alpha:]])*\1){2}[[:alpha:]]*\b' /usr/share/dict/words |
grep -viP '^[[:alpha:]]*([[:alpha:]])((?:(?!\1)[[:alpha:]])*\1){3}'
Первый grep находит слова с 3 или более одинаковыми символами, а второй исключает слова с 4 или более.
Я не уверен, можно ли это сделать с помощью одного регулярного выражения или нет.
(это соответствует 56820 словам в моем файле /usr/share/dict/words ).