Удаление первых трех символов из столбца

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 ḉ
-5
06.07.2015, 15:09
0 ответов

Теги

Похожие вопросы