답변:
여기에 똑 바른 방법이 있습니다 sed
.
$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy
또는 sed
로케일에 소문자 <-> 대문자 변환이있는 모든 문자로 작업 하는 GNU의 짧은 방법 :
$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy
다음과 같은 다른 도구를 사용할 수있는 경우 :
perl
(ASCII 문자로 제한) :
$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy
perl
(더 일반적으로):
$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ
sed
는 입력에서 GNU 와 다른 경우를 가정합니다 . sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'
대신 사용하십시오 (여전히 GNU 특정). 첫 번째 문자는 26 개의 ASCII 라틴 문자 만 변환하고 두 번째 문자는 로케일에서 인식되는 문자를 변환합니다. tr
하나는 ASCII 로케일에서 의미가 있습니다. perl
하나는 ASCII 라틴어 문자 작동합니다.
POSIXly, @cuonglm이 표시 한대로sed
음역하려는 전체 문자 세트를 제공하는 것 외에는 이를 수행 할 수 없습니다 .
그것은 함께 할 수 tr
있지만, 어떤이의 tr
(음역)입니다 :
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
그러나 Linux에서는 제한이 있습니다. tr
Linux 기반 시스템에서 일반적으로 발견 되는 3 가지 구현 중 :
tr
에서는 단일 바이트 문자 세트에만 작동합니다. 예를 들어 Stéphane Chazelas
UTF-8 로케일에서 sTéPHANE cHAZELAS
대신 대신 제공 합니다 sTÉPHANE cHAZELAS
. 그것은 GNU의 알려진 제한 사항입니다 tr
.tr
작업을하지 않는 가보 toolchest을에서 (당신이 얻을 stéphane chazelas
).tr
가 할 일이 아닙니다 .FreeBSD에서는 정상적으로 작동합니다. 인증 된 Unix 시스템에서도 제대로 작동 할 것으로 기대합니다.
bash
쉘은 그위한 전용 연산자가 있습니다 :
in=AbCdE
out=${in~~}
로 zsh -o extendedglob
:
out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
ⴠ
(e2 b4 a0)는 Ⴠ
(e1 83 80)입니다. 모두 i
(69) 및 ı
(B1 내지 C4)가있다 I
(49) 등 (터키어 로케일 대문자 제외 i
된다 İ
). tr
GNU에서 tr
작동 하지 않는 이유는 GNU 가 문자가 아닌 바이트로 작동하기 때문입니다.
[:lower:]
또는 하나의 발생 만 지원하는 것처럼 보입니다 [:upper:]
(첫 번째는 무시됩니다). 심지어 프랑스어, œ -> Œ
인 c5 93 -> c5 92
UTF-8 및 bd -> bc
ISO8859-15에.
이것은 tr
Stéphane Chazelas가 제공 하는 솔루션 과 동일한 제한 사항을 가지고 있지만 다른 방법입니다.
{ echo QWERTYqwerty | dd conv=lcase
echo QWERTYqwerty | dd conv=ucase
} 2>/dev/null
qwertyqwerty
QWERTYQWERTY
나는 덤프 stderr
에 /dev/null
있기 때문에이 dd
또한 모든 조작으로 통계를 제공하는 2
파일 기술자를. 이것은 수행중인 작업에 따라 유용 할 수 있지만이 데모에는 적합하지 않습니다. dd
예를 들어 다음 과 같은 다른 모든 작업이 여전히 적용됩니다.
echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null
QWERTY
QWERTY
aBc
로 변환되지 않음 AbC
).
주요 목표가 파일을 하위 클래스에서 상위 클래스로 변환하는 것이라면 파일을 사용 tr
하고 STDOUT
변환 하지 않는 이유는 무엇입니까?
$cat FILENAME | tr a-z A-Z > FILENAME2
FILENAME
원본 파일은 어디에 있습니까 ? FILENAME2
변환 된 출력 파일은 어디에 있습니까 ?
é
예를 들어 (적어도 내 파일에서는) 와 같이 악센트 부호가있는 문자로는 작동하지 않았습니다 .
사용하여 awk
:
awk '{print tolower($0)}' file.txt | tee file.txt
>file.txt
파일을 잘라서 시작합니다
간단한 것을 단순하게 유지하십시오. 문자를 번역하도록 설계된 필터는 tr
입니다.
echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
tr
보다 더 적합합니다sed
.