bash에서 UTF-8 txt 파일을 모두 대문자로 변환하는 방법은 무엇입니까?

bash에서 UTF-8 txt 파일을 모두 대문자로 변환하는 방법은 무엇입니까?

모두 대문자로 변환하려는 UTF-8 .txt 파일이 있습니다. ASCII인 경우 다음을 사용할 수 있습니다.

tr [:lower:] [:upper:]

그런데 발음 구별부호 같은 걸 사용하고 있어서 별 효과가 없는 것 같아요. 적절한 로케일을 설정하면 작동할 것이라고 생각하지만 이식 가능하려면 이 스크립트가 필요합니다.

답변1

모두:

tr '[:lower:]' '[:upper:]'

(따옴표를 잊지 마세요. 그렇지 않으면 현재 디렉터리에 :, , ...라는 l파일이 있으면 명령이 작동하지 않습니다 .) 또는:r

awk '{print toupper($0)}'

또는:

dd conv=ucase

현재 로케일에 정의된 규칙에 따라 문자를 대문자로 변환하도록 설계되었습니다. 그러나 로케일이 문자 집합으로 UTF-8을 사용하고 소문자에서 대문자로의 변환을 명시적으로 정의하더라도 최소한 GNU dd및 GNU (예: trUbuntu의 mawk기본값 )는 이를 따르지 않습니다. awk남은 거 아무거나기준C또는 이외의 로케일을 지정하는 방법을 사용 POSIX하므로 현재 로케일에 관계없이 UTF-8 파일을 대문자로 이식 가능하게 변환하려는 경우 표준 도구 상자를 사용할 수 없습니다.

일반적으로 이식성을 위해 가장 좋은 선택은 아마도 Perl입니다.

$ echo lľsšcčtťzž | PERLIO=:utf8 perl -pe '$_=uc'
LĽSŠCČTŤZŽ

이제 특정 문자의 대문자 버전이 무엇인지에 대해 모든 사람이 동의하는 것은 아니라는 점에 유의해야 합니다.

예를 들어, 터키어 로케일에서 대문자 는 가 i아니라 ( )입니다. 여기서는 GNU tr 대신 가보 도구 상자를 사용합니다.Iİ<U0130>tr

$ echo ií | LC_ALL=C.UTF-8 tr '[:lower:]' '[:upper:]'
$ echo ií | LC_ALL=tr_TR.UTF-8 tr '[:lower:]' '[:upper:]'
İÍ

내 시스템에서는 perl대문자 변환이 에 정의되어 있으며 /usr/share/perl/5.14/unicore/To/Upper.pl로케일의 일부 문자에서 GNU libc와 다르게 작동하는 것으로 나타났습니다. 예를 들어, 올바르게 배치toupper()C.UTF8perlperlɀ도착하다Ɀ, GNU libc(2.17)은 그렇지 않습니다.

답변2

awk기능 을 이용 toupper하면 가능하다고 생각합니다 .

예를 들어

GNU에서는 사용할 수 없습니다 tr:

$ echo lľsšcčtťzž | tr '[:lower:]' '[:upper:]'
LľSšCčTťZž

GNU로 작업하기 awk:

$ echo lľsšcčtťzž | awk '{ print toupper($0) }'
LĽSŠCČTŤZŽ

답변3

이것은 OS X에서는 작동 tr하지만 GNU에서는 작동하지 않습니다 tr.

tr '[:lower:]' '[:upper:]'

이는 작동 gawk하지만 mawk또는 nawk( /usr/bin/awkOS X에서는)에서는 작동하지 않습니다.

awk '{print toupper($0)}'

또 다른 옵션은 GNU를 사용하는 것입니다 sed.

sed 's/./\u&/g'

Bash 4.0 이상에서는 ^^매개변수 확장을 사용할 수도 있습니다.

while IFS= read -r l;do printf %s\\n "${l^^}";done

관련 정보