첫 글자를 제외한 모든 글자를 소문자로 만듭니다. 변경하고 나니 첫 글자가 "capital"(키릴 문자의 대문자)처럼 보였습니다. 나머지(대문자 사용 안 함)는 변경되지 않습니다.
죄송합니다. 키릴 문자입니다. 예를 들어 АБРАЗИЯ Абразия
나는 올바른 일반 명령을 내렸습니다.
:%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
모든 문자의 유니코드 숫자는 동일한 크기입니다.
다시 확인했습니다.
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번 호출하거나 9@q
42번 호출할 수 있습니다 42@q
. 이 특정 매크로의 경우 여러 번 호출해도 안전하므로 를 사용할 수 있습니다 9999@q
.
또 다른 경로는 재귀 매크로입니다.
qqqqqlguew@qq
qqq
--q
매크로 기록을 시작한 후 즉시 기록을 중지하여 이 레지스터를 효과적으로 지웁니다.@q
--q
지금은 비어 있지만 매크로를 호출합니다.아니요매크로 기록을 중지하면- 나머지는 위와 같이 동작합니다.
매크로는 문서의 마지막 단어 끝에 도달하면 종료됩니다(그러한 오류가 발생하면 종료됩니다. 그렇지 않으면 영원히 계속됩니다).