내 질문은 모든 텍스트를 대문자에서 소문자로 또는 그 반대로 변환하는 방법입니다. 즉, 모든 문자의 대소문자를 변경합니다. 어떻게든 대체를 통해 이루어져야 합니다 sed
.
답변1
간단한 접근 방식은 다음과 같습니다 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'
ΑβΓ
답변2
sed
POSIXly, 음역하려는 전체 문자 세트를 제공하지 않으면 이 작업을 수행할 수 없습니다.@cuonglm님이 보여주셨어요.
하지만 그것은 가능합니다 tr
. 그리고 여기 있습니다 tr
(음역):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
그러나 Linux에서는 제한이 있습니다. tr
Linux 기반 시스템의 세 가지 일반적인 구현 중:
- GNU의 경우
tr
단일 바이트 문자 집합에서만 작동합니다. 예를 들어,Stéphane Chazelas
UTF-8 로케일에서는sTéPHANE cHAZELAS
no 를 제공합니다sTÉPHANE cHAZELAS
. 이는 GNU의 알려진 제한 사항입니다tr
. - Heirloom Toolbox 에서는
tr
이것이 작동하지 않습니다stéphane chazelas
. - busybox는 이것을 하지 않습니다
tr
.
하지만 FreeBSD에서는 잘 작동합니다. 인증된 Unix 시스템에서도 제대로 작동할 것으로 예상할 수 있습니다.
셸에는 bash
다음과 같은 전용 연산자가 있습니다.
in=AbCdE
out=${in~~}
그리고 zsh -o extendedglob
:
out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
답변3
주요 목표가 하위 클래스의 파일을 상위 클래스로 변환하는 것이라면 파일을 변환하는 데 tr
및 를 사용하는 것은 어떨까요?STDOUT
$cat FILENAME | tr a-z A-Z > FILENAME2
FILENAME
원본 파일은 어디에 있나요? FILENAME2
변환된 출력 파일은 어디에 있습니까?
답변4
ruby
명령줄 사용법과 유사한 문자열 방법이 있습니다.perl
$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy
당신은 또한 볼 수 있습니다Ruby-doc 인코딩
$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ' | ruby -pe '$_.swapcase!'
ΑβΓ