모두 대문자로 변환하려는 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 (예: tr
Ubuntu의 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:]'
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()
C.UTF8
perl
perl
ɀ도착하다Ɀ, 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/awk
OS 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