대문자 문자열을 소문자로 변환하는 명령?


47

대문자 문자열을 소문자로 또는 그 반대로 변환하기 위해 사용할 수있는 Bash 명령은 무엇입니까?

감사합니다.



2
stackoverflow.com/questions/2264428/…에 많은 솔루션이 있습니다. 얼핏보기에는 여기에서도 가장 많이 다루어지는 것 같습니다.
pbhj

답변:


59

문자열이 변수에 이미 저장되어 있으면 bash변수 확장 ${parameter,,pattern}(bash 4.0부터 사용 가능)을 사용할 수 있습니다. 여기서 parameter변수의 이름 pattern은 생략됩니다.

$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!

변수의 값은 변경되지 않고 출력 만 변경됩니다. 변수를 변경하려면 새 값을 지정해야합니다.

$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!

대문자 변환은 다음과 함께 작동합니다 ${parameter^^pattern}.

$ echo ${string^^}
HELLO, WORLD!

이것은 유니 코드 문자열에서도 작동합니다 (적어도 현재 bash 버전에서는 bash 4.3 이상이 필요합니다).

$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ

당신이 사용하는 경우 zsh, 당신이 사용할 수있는 매개 변수 확장 플래그 ( ${(FLAGS)NAME}동일한 결과를 달성하기 위해, zsh을 2.5부터 사용 가능)을. bash구문은 작동하지 않습니다 zsh ) 1 . 소문자 플래그는 L; 대문자의 경우 U:

$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"

이것은 유니 코드 문자열에서도 작동합니다 (적어도 zsh 5.0부터; 이전 버전에서는 시도하지 않았습니다).

$ string='ἈΛΦΆβητος'
$ echo ${(L)string} 
ἀλφάβητος
$ echo ${(U)string}  
ἈΛΦΆΒΗΤΟΣ



1) 비록 zsh가이 기능을 훨씬 더 오래 사용한다는 것을 알면 아마도 " zsh구문은 작동하지 않습니다bash .


3
${string,,}표기법은 bash 버전 4 이상에서만 존재합니다. 그렇지 않으면와 같은 다른 솔루션 중 하나가 필요합니다 $(echo $string | tr '[:upper:]' '[:lower:]').
Quinn Comendant

40

유니 코드에서 올바르게 작동하는 방법은 거의 없습니다.

GNU sed 4.2.2 작동 :

$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ

bash 4.2.45 선언이 작동 하지 않습니다 .

$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą

bash 4.2.45 매개 변수 확장이 작동 하지 않습니다 .

$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą

bash 4.3.42 declare및 매개 변수 확장 작업 :

$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką

GNU tr 8.20이 작동 하지 않습니다 :

$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą

mawk (Ubuntu 13.10의 기본 awk)가 작동 하지 않습니다 .

$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą

gawk 작품 :

$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ

Perl pure uc ()가 작동 하지 않습니다 :

$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą

유니 코드 힌트가 없는 Python 2는 작동 하지 않습니다 .

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą

유니 코드 작동 을 다루라는 지시가있는 파이썬 2 :

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ

파이썬 3 작동 :

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ

1
우분투 13.04에서는 gawk기본 awk로 표시됩니다 (와 같이 표시 update-alternatives --display awk). mawk13.10의 기본값 이 확실 합니까?
kiri December

sed1990 년부터 \U;-) 옵션 을 지원했습니다 . 딱딱한 기능이 아닙니다. 그렇지 않으면, 큰 대답, 많은 옵션, 너무 적은 시간 ;-) 모두에게 행운을 빕니다!
shellter

- : 플러스 다음 링크에서 더보기 - 터키 (점과 점이없는 난) 몇 가지 문제가있을 것입니다 unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/... - en.wikipedia 사용자. org / wiki / Dotted_and_dotless_I
azat

귀하의 예에서 또는을 uc사용해야하기 때문에 Perl에서 지갑 이 작동하지 않습니다 . 예제를 다시 작성 하면 작동합니다. stackoverflow.com/a/13261662/3701431 참조 use Encodeuse utf8echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'
Sergiy Kolodyazhnyy

20

bash 내부 조판 또는 선언 명령을 사용하여 소문자 변수를 정의합니다.

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case

변수를 입력 할 때가 아니라 값을 설정하면 문자가 낮아집니다. 따라서 스크립트 시작 부분에 조판하는 것이 좋습니다. 대문자의 경우 -u 를 입력 할 수 있습니다 .

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE

이것은 bash 쉘에만 국한되지 않으며 ksh에서도 작동하며 POSIX 쉘 정의에서도 가능합니다.

편집 : 많은 사람들이 조판 이 bash에서 더 이상 사용되지 않고 선언으로 대체 된다는 사실을 부드럽게 지적 했습니다 . 두 명령 모두 동일합니다.

$ help typeset
typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.

    Obsolete.  See `help declare'.


$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
    Set variable values and attributes.

이기종 환경에서 작업 할 때는 여전히 typeset 구문을 사용하므로 스크립트를 다시 작성할 필요가 없습니다.


2
+1 믿어지지 않는, 나는 그것을 전혀 몰랐다! BTW 몇 가지 추가 정보 : 나는 설명서에이 고개는 그가 보인다 typeset의해 depricated 대체 간주됩니다declare

1
@ 톰 감사합니다, bash는 "본 쉘 뿌리"와는 거리가 멀어지기 시작한 것 같습니다 :)
Emmanuel

17

tr명령으로 할 수 있습니다 .

터미널에서 ( Ctrl+ Alt+ T)

이 명령은

echo 'String here' | tr "[:lower:]" "[:upper:]"

소문자를 대문자로 변환합니다.

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"

대문자를 소문자로 변환합니다.

예:

여기에 이미지 설명을 입력하십시오

신용은 사이버 시티 로 간다


2
로케일에 신경 쓰지 않으면 tr A-Z a-z작동합니다.
Nick Matteo

9

당신 sed도 물건을 통해 파이프 수 있습니다 :

$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE

그리고 \L반대 효과가 있습니다.

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase

1

순수한 bash 솔루션은 아니지만 Oliperl마찬가지로 문자열을 파이프로 연결할 수 있습니다 .sed

$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE

그리고 \L반대 효과가 있습니다.

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase

-1

이 간단한 명령을 사용하십시오. 대문자에서 소문자로 'f'는 변환하려는 파일 이름입니다.

tr "A-Z" "a-z" < f

소문자에서 대문자로

tr "a-z" "A-Z" < f

1
이전 답변에 대한 의견에서 언급했듯이 일부 지역에서는 작동하지 않습니다.
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.