%20%D0%B8%D0%B7%20%D0%97%D0%90%D0%93%D0%9B%D0%90%D0%92%D0%9D%D0%AB%D0%A5%20%D0%B2%20%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B5.png)
Сделать все буквы строчными, кроме первой. Первая буква будет выглядеть как "Заглавная" после того, как я изменил (с ЗАГЛАВНОЙ в кириллице). Остальные (не ЗАГЛАВНЫЕ) оставить без изменений.
Извините, что кириллицей. например АБРАЗИЯ Абразия
Я отдал правильную общую команду:
:%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
макрос, который сейчас пуст, но будетнетбыть как только вы прекратите запись макроса- Остальное ведет себя так же, как указано выше.
Когда макрос достигает конца последнего слова в документе, он завершает работу (как и при любой ошибке такого рода — в противном случае он продолжался бы вечно).