키릴 문자 UPPERCASE의 첫 번째(대문자) 문자를 제외한 모두 소문자

키릴 문자 UPPERCASE의 첫 번째(대문자) 문자를 제외한 모두 소문자

첫 글자를 제외한 모든 글자를 소문자로 만듭니다. 변경한 후 첫 번째 문자는 "대문자"처럼 보입니다(키릴 문자의 대문자에서). 나머지(대문자 아님)는 변경되지 않습니다.

죄송하지만 키릴 문자로 되어 있어요. 예: АБРАЗИЯ Абразия

나는 올바른 일반 명령을 내렸습니다.

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

그리고 그것은 작동하지 않았습니다

내 리눅스는 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.

이 패턴이 작동하려면 UTF-8을 사용하도록 vim을 설정해야 합니다.

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지금은 비어 있지만 매크로 를 호출합니다.~ 아니다매크로 기록을 중단하면
  • 나머지 부분은 위와 같이 동작합니다.

매크로가 문서의 마지막 단어 끝에 도달하면 종료됩니다(해당 종류의 오류가 발생하는 경우와 마찬가지로 종료됩니다. 그렇지 않으면 영원히 계속됩니다).

관련 정보