![모든 텍스트를 대문자에서 소문자로 또는 그 반대로 변환하시겠습니까?](https://linux55.com/image/37806/%EB%AA%A8%EB%93%A0%20%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EB%8C%80%EB%AC%B8%EC%9E%90%EC%97%90%EC%84%9C%20%EC%86%8C%EB%AC%B8%EC%9E%90%EB%A1%9C%20%EB%98%90%EB%8A%94%20%EA%B7%B8%20%EB%B0%98%EB%8C%80%EB%A1%9C%20%EB%B3%80%ED%99%98%ED%95%98%EC%8B%9C%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
내 질문은 모든 텍스트를 대문자에서 소문자로 또는 그 반대로 변환하는 방법입니다. 즉, 모든 문자의 대소문자를 변경합니다. 어떻게든 대체를 통해 이루어져야 합니다 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!'
ΑβΓ