grep -xe '\(.\).*\1' -e .
Пример:
$ printf '%s\n' il y était cet été | grep -xe '\(.\).*\1' -e .
y
été
-x
- для точного совпадения (совпадения по всей строке). \ 1
является обратной ссылкой на символ, захваченный в \ (. \)
. Мы добавляем -e.
для особого случая строки, содержащей один единственный символ.
Предполагается, что ввод содержит допустимый текст в текущей локали.
Соответствует символ , а не байт (например, é в UTF-8 - это два байта 0xc3 0xa9), ни кластер графема ( это не сработало бы, если бы эти é были написаны в разложенной форме с помощью e
, за которым следовало бы U + 0301, например, с сочетанием острого ударения).
Для работы с кластерами графема с grep
, который поддерживает -P
для PCRE:
$ printf 'e\u0301te\u0301\n' | grep -xPe '(\X).*\1|\X'
été
Предполагается, что разложение одинаково для двух кластеров, например ḉ
, выраженное как c
U + 0301
U + 0327
, не будет соответствовать выражению, выраженному как c
U + 0327
U + 0301
или ć
( U + 0107
) U + 0327
или ç
( U + 00E7
) U + 0301
или ḉ ( U + 1E09
). Для этого вам нужно будет выполнить проверку в нормализованной форме:
$ printf '\ue7\u301 blah \u107\u327\n' |
perl -MUnicode::Normalize -C -ne '
print if /^\X$/ || NFC($_) =~ /^(\X).*\1$/'
ḉ blah ḉ