Все строчные буквы, кроме первой (заглавной) из ЗАГЛАВНЫХ в кириллице

Все строчные буквы, кроме первой (заглавной) из ЗАГЛАВНЫХ в кириллице

Сделать все буквы строчными, кроме первой. Первая буква будет выглядеть как "Заглавная" после того, как я изменил (с ЗАГЛАВНОЙ в кириллице). Остальные (не ЗАГЛАВНЫЕ) оставить без изменений.

Извините, что кириллицей. например АБРАЗИЯ Абразия

Я отдал правильную общую команду:

:%s/\<\u\zs\u*/\L&/g

И это не сработало.

Мой Linux — Gentoo, моя локаль — echo $LANG en_US.UTF-8.

Я также попробовал:

 %s/\<[А-Я]\zs\[А-Я][а-я]*...

Я не знаю, как правильно использовать этот синтаксис. Думаю, это может сработать.

Я не понимаю, даже после того, как

:se noic /[[:upper:]] 

не работает. Должно быть, это особенность локали (мне интересно).

sed -n '322p' geod.txt | cut -f 1 -d " " 
АВГИТИТ—
sed -n '322p' geod.txt | cut -f 1 -d " " | xxd
0000000: d090 d092 d093 d098 d0a2 d098 d0a2 e280

Хотя все буквы имеют одинаковую величину нумерации Unicode.

Я перепроверил еще раз:

file -bi geod.txt
text/plain; charset=utf-8

Так что с utf-8 все в порядке (хотя «файл» может пойти не так).

Вот мой исходный файл: http://bpaste.net/show/140967/

решение1

РЕДАКТИРОВАТЬ:Поскольку есть некоторая путаница относительно того, следует ли использовать vimили . Я предлагаю решения для обоих вариантов:sed

Вим

Следующая подстановка заменяет слова на строчные буквы, кроме первой буквы. Слова из одной буквы преобразуются в заглавные.

:%s/\<\(\k\)\(\k*\)\>/\u\1\L\2/g

\kсоответствует буквенно-цифровым символам и _. Широко используемый \wэквивалентен [A-Za-z0-9_]и не будет работать с кириллическими буквами.

Операторы \<и \>захватывают границы слов, а скобки группируют совпадение по первой букве и остальным буквам, которые извлекаются с помощью \1и \2соответственно.

Чтобы этот шаблон работал, вам необходимо настроить vim на использование UTF-8.

set encoding=utf-8

Сед

sed 's/\b\([[:alpha:]]\)\([[:alpha:]]*\)\b/\u\1\L\2/g' <inputfile>

\bсоответствует границам слов в sed, остальное совпадает с vimверсией. (Проверено на GNU sed, классы символов могут не поддерживаться во всех sedверсиях.)

решение2

Это можно сделать с помощью регулярных выражений, и существующий ответ прекрасно охватывает этот метод, но есть и другой подход.

Для одного слова просто перейдите к первой букве слова и используйте:

lgue

Чтобы сделать больше одного слова, вам понадобится макрос

qqlguewq

Я объясню это:

  • qq-- начать запись макроса под названиемq
  • l(это строчная буква L) — переместиться на один символ вправо
  • gue-- перевести все символы в нижний регистр (то есть gu) до конца текущего слова ( e)
  • w-- перейти к первому символу следующего слова
  • q-- остановить запись макроса

Вы можете вызвать макрос с помощью @q. Вы можете вызвать его девять раз с помощью 9@q, или сорок два раза с помощью 42@q. С этим конкретным макросом безопасно вызывать его произвольное количество раз — поэтому вы можете использовать 9999@q.

Другой путь — рекурсивный макрос:

qqqqqlguew@qq
  • qqq-- начинает запись макроса q, затем немедленно останавливает запись, фактически очищая этот регистр
  • @q-- вызывает qмакрос, который сейчас пуст, но будетнетбыть как только вы прекратите запись макроса
  • Остальное ведет себя так же, как указано выше.

Когда макрос достигает конца последнего слова в документе, он завершает работу (как и при любой ошибке такого рода — в противном случае он продолжался бы вечно).

Связанный контент