모든 텍스트를 대문자에서 소문자로 또는 그 반대로 변환 하시겠습니까?


17

내 질문은 어떻게 모든 텍스트를 대문자에서 소문자로 또는 그 반대로 변환 할 수 있습니까? 그것은 모든 문자의 경우를 변경하는 것입니다. 그것은으로 수행되어야 sed어떻게 든 교체.


4
tr보다 더 적합합니다 sed.
choroba 2016 년

답변:


20

여기에 똑 바른 방법이 있습니다 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'
ΑβΓ

3
두 번째 sed는 입력에서 GNU 와 다른 경우를 가정합니다 . sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'대신 사용하십시오 (여전히 GNU 특정). 첫 번째 문자는 26 개의 ASCII 라틴 문자 만 변환하고 두 번째 문자는 로케일에서 인식되는 문자를 변환합니다. tr하나는 ASCII 로케일에서 의미가 있습니다. perl하나는 ASCII 라틴어 문자 작동합니다.
Stéphane Chazelas

16

POSIXly, @cuonglm이 표시 한대로sed 음역하려는 전체 문자 세트를 제공하는 것 외에는 이를 수행 할 수 없습니다 .

그것은 함께 할 수 tr있지만, 어떤이의 tr(음역)입니다 :

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

그러나 Linux에서는 제한이 있습니다. trLinux 기반 시스템에서 일반적으로 발견 되는 3 가지 구현 중 :

  • GNU tr에서는 단일 바이트 문자 세트에만 작동합니다. 예를 들어 Stéphane ChazelasUTF-8 로케일에서 sTéPHANE cHAZELAS대신 대신 제공 합니다 sTÉPHANE cHAZELAS. 그것은 GNU의 알려진 제한 사항입니다 tr.
  • 함께 tr작업을하지 않는 가보 toolchest을에서 (당신이 얻을 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]}}

따라서 데스크톱 세계에서만 OSX 가합니까? 왜 작동하지 않습니까? 액센트 문자의 소문자 버전과 대문자 대응 문자 사이의 16 진수 값에 일정한 오프셋이있는 것처럼 다른 구현입니까?

1
@ illuminÉ, 데스크탑 세계가 무엇을 의미하는지 잘 모르겠습니다 . AFAICS, 문제는 GNU와 관련이 있으며 대부분의 Unices에는 "데스크톱"이 있습니다. ASCII 및 일부 iso8859 문자 세트 외에도 16 진수 오프셋을 일반화 할 수 있으며 UTF-8과 같은 인코딩에는 의미가 없습니다. 예를 들어 UTF-8에서 대문자 (e2 b4 a0)는 (e1 83 80)입니다. 모두 i(69) 및 ı(B1 내지 C4)가있다 I(49) 등 (터키어 로케일 대문자 제외 i된다 İ). trGNU에서 tr작동 하지 않는 이유는 GNU 가 문자가 아닌 바이트로 작동하기 때문입니다.
Stéphane Chazelas 2016 년

나는 일종의 주류를 의미하지만 실제로 이해가되지 않습니다. 나는 방금 프랑스어 악센트 문자 (그리고 실제로는 "é")를 보았고 바이트에 관한 것을 잊어 버린 매우 단순한 가정을했습니다. 그러나 가보? 나는 그 대답을 다시 읽을 것이다!

1
@ illuminÉ, 가보의 경우 다른 문제입니다. [:lower:]또는 하나의 발생 만 지원하는 것처럼 보입니다 [:upper:](첫 번째는 무시됩니다). 심지어 프랑스어, œ -> Œc5 93 -> c5 92UTF-8 및 bd -> bcISO8859-15에.
Stéphane Chazelas 2016 년

2

이것은 trSté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).
Stéphane Chazelas 2016 년

1
@ StéphaneChazelas-사실이지만, 내가 오해하지 않는 한, 그 질문은 아니 었습니까?
mikeserv

2

주요 목표가 파일을 하위 클래스에서 상위 클래스로 변환하는 것이라면 파일을 사용 tr하고 STDOUT변환 하지 않는 이유는 무엇입니까?

$cat FILENAME | tr a-z A-Z > FILENAME2

FILENAME원본 파일은 어디에 있습니까 ? FILENAME2변환 된 출력 파일은 어디에 있습니까 ?


é예를 들어 (적어도 내 파일에서는) 와 같이 악센트 부호가있는 문자로는 작동하지 않았습니다 .
Sigur

1

사용하여 awk:

awk '{print tolower($0)}' file.txt | tee file.txt

이것이 효과가 있다고 확신합니까? >file.txt파일을 잘라서 시작합니다
iruvar

2
그런 다음 분명히 시도하지 않았습니다.
Stéphane Chazelas

0

ruby 명령 줄과 비슷한 사용법을위한 문자열 메서드가 있습니다. perl

$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy

참조 루비 문서 인코딩

$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ'  | ruby -pe '$_.swapcase!'
ΑβΓ

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