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


10

모든 대문자로 변환하려는 UTF-8 .txt 파일이 있습니다. ASCII 일뿐이라면 다음을 사용할 수 있습니다.

tr [:lower:] [:upper:]

그러나 분음 부호 및 항목으로 작업하고 있기 때문에 작동하지 않는 것 같습니다. 적절한 로케일을 설정하면 작동 할 수 있지만이 스크립트는 이식 가능해야합니다.

답변:


14

모든:

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

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

awk '{print toupper($0)}'

또는:

dd conv=ucase

현재 로케일에 정의 된 규칙에 따라 문자를 대문자로 변환합니다. 그러나 로케일이 문자 세트로 UTF-8을 사용하고 소문자에서 대문자로의 변환을 명확하게 정의하더라도, GNU dd, GNU trmawk( awk예를 들어 우분투 의 기본값 )은 그 뒤에 따르지 않습니다. 또한 또는 이외의 로케일을 지정하는 표준 방법 이 없으므로 현재 로케일에 관계없이 UTF-8 파일을 대문자로 변환하려면 표준 도구를 사용하는 것이 좋지 않습니다.CPOSIX

종종 이식성을 위해 가장 좋은 방법은 펄일 수 있습니다.

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

이제 특정 문자의 대문자 버전에 대해 모든 사람이 동의하는 것은 아닙니다.

예를 들어, 터키어 로케일에서 대문자가 i되지 않습니다 I만, İ( <U0130>). 여기 tr에 GNU tr 대신에 가보 도구가 있습니다 :

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

내 시스템에서 perl상위 변환은에 정의 되어 있으며 로케일 /usr/share/perl/5.14/unicore/To/Upper.pl의 GNU libc toupper()와 약간 다른 문자에서 다르게 동작한다는 것이 더 정확합니다. 예를 들어 ɀⱿ 로 올바르게 변환 하면 GNU libc (2.17)는 그렇지 않습니다.C.UTF8perlperl


가치가 있기 때문에 모든 대문자가 명확하게 정의 된 체코 문자로 작업하고 있으며 로케일 집합은 아마도 체코가 아닌 C 일 것이므로 문제가됩니다. Perl은이 툴체인에서 이미 사용되므로 다른 용도로 추가해도 나쁘지 않을 수 있습니다. 자세한 설명 감사합니다, btw!
VPeric

3

나는 당신이 이것 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Ž

@ StephaneChazelas-실패한 예를 변경했습니다.
slm

즉, 현재 로케일과에 따라 달라집니다 tr또는awk 구현입니다. 예를 들어, tr현재 로케일에 따르면 GNU tr는 UTF8 로케일에있을 때 대부분 문자를 올바르게 변환 하지 않습니다. mawk하지 않습니다.
Stéphane Chazelas

1
실제로 FreeBSD (9.1)에서는 다른 방식으로 진행됩니다. -와는 작동 tr하지만awk
스테판 Chazelas가에게

@StephaneChazelas-나는 분산에 정통하지 않습니다 8-). 방금 공감 한 사람, 왜 궁금해?
slm

2

이것은 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.