Bash에서 문자열을 소문자로 변환하는 방법
bash에서 문자열을 소문자로 변환하는 방법이 있나요?
예를 들어 다음과 같은 경우:
a="Hi all"
변환 대상:
"hi all"
다음과 같은 다양한 방법이 있습니다.
POSIX 규격
tr
$ echo "$a" | tr '[:upper:]' '[:lower:]'
hi all
AWK
$ echo "$a" | awk '{print tolower($0)}'
hi all
POSIX 이외의
다음의 예에서는, 휴대성의 문제가 발생할 가능성이 있습니다.
Bash 4.0
$ echo "${a,,}"
hi all
sed의
$ echo "$a" | sed -e 's/\(.*\)/\L\1/'
hi all
# this also works:
$ sed -e 's/\(.*\)/\L\1/' <<< "$a"
hi all
펄
$ echo "$a" | perl -ne 'print lc'
hi all
배쉬
lc(){
case "$1" in
[A-Z])
n=$(printf "%d" "'$1")
n=$((n+32))
printf \\$(printf "%o" "$n")
;;
*)
printf "%s" "$1"
;;
esac
}
word="I Love Bash"
for((i=0;i<${#word};i++))
do
ch="${word:$i:1}"
lc "$ch"
done
YMMV를 사용하다.「」를 44. 같은 2, 있지 shopt -u nocasematch;
. " ]가와 일치하지만 [) 이상하게 [와 nocasematch로 인해 [[ fooBaR == "FOObar" ]가 OK와 일치하도록 설정되지 않았지만 [b-z] 내부 대소문자가 이상하게 [A-Z]와 일치하지 않습니다.네거티브(" nocasematchBash " "("nocasematch " " ") " " " " " " " " " " " "에 의해 됩니다.
Bash 4의 경우:
소문자로
$ string="A FEW WORDS"
$ echo "${string,}"
a FEW WORDS
$ echo "${string,,}"
a few words
$ echo "${string,,[AEIUO]}"
a FeW WoRDS
$ string="A Few Words"
$ declare -l string
$ string=$string; echo "$string"
a few words
대문자 입력
$ string="a few words"
$ echo "${string^}"
A few words
$ echo "${string^^}"
A FEW WORDS
$ echo "${string^^[aeiou]}"
A fEw wOrds
$ string="A Few Words"
$ declare -u string
$ string=$string; echo "$string"
A FEW WORDS
전환(문서화되어 있지 않지만 컴파일 시 임의로 구성 가능)
$ string="A Few Words"
$ echo "${string~~}"
a fEW wORDS
$ string="A FEW WORDS"
$ echo "${string~}"
a FEW WORDS
$ string="a few words"
$ echo "${string~}"
A few words
대문자로 표시(문서화되어 있지 않지만 컴파일 시 임의로 구성 가능)
$ string="a few words"
$ declare -c string
$ string=$string
$ echo "$string"
A few words
제목 대소문자:
$ string="a few words"
$ string=($string)
$ string="${string[@]^}"
$ echo "$string"
A Few Words
$ declare -c string
$ string=(a few words)
$ echo "${string[@]}"
A Few Words
$ string="a FeW WOrdS"
$ string=${string,,}
$ string=${string~}
$ echo "$string"
A few words
를 declare
, " " "+
를 들어.declare +c string
이는 현재 값이 아닌 후속 할당에 영향을 미칩니다.
declare
옵션을 지정하면 변수의 속성이 변경되지만 내용은 변경되지 않습니다.예제의 재할당은 내용을 업데이트하여 변경 내용을 표시합니다.
편집:
글자를 한 표시" (「첫 글자를 한 글자씩 ${var~}
ghostdog74에 의해 제안되었습니다.
편집: Bash 4.3과 일치하도록 칠드 동작을 수정했습니다.
echo "Hi All" | tr "[:upper:]" "[:lower:]"
tr:
a="$(tr [A-Z] [a-z] <<< "$a")"
AWK:
{ print tolower($0) }
sed:
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
오래된 투고인 것은 알지만, 다른 사이트를 위해 이 답변을 작성했기 때문에 여기에 투고하려고 합니다.
UPER -> lower: python:
b=`echo "print '$a'.lower()" | python`
또는 루비:
b=`echo "print '$a'.downcase" | ruby`
또는 Perl:
b=`perl -e "print lc('$a');"`
또는 PHP:
b=`php -r "print strtolower('$a');"`
또는 Awk:
b=`echo "$a" | awk '{ print tolower($1) }'`
또는 SED:
b=`echo "$a" | sed 's/./\L&/g'`
또는 Bash 4:
b=${a,,}
또는 NodeJ:
b=`node -p "\"$a\".toLowerCase()"`
,도할 수 .dd
:
b=`echo "$a" | dd conv=lcase 2> /dev/null`
하부 -> 상부:
python 사용:
b=`echo "print '$a'.upper()" | python`
또는 루비:
b=`echo "print '$a'.upcase" | ruby`
또는 Perl:
b=`perl -e "print uc('$a');"`
또는 PHP:
b=`php -r "print strtoupper('$a');"`
또는 Awk:
b=`echo "$a" | awk '{ print toupper($1) }'`
또는 SED:
b=`echo "$a" | sed 's/./\U&/g'`
또는 Bash 4:
b=${a^^}
또는 NodeJ:
b=`node -p "\"$a\".toUpperCase()"`
,도할 수 .dd
:
b=`echo "$a" | dd conv=ucase 2> /dev/null`
조개껍데기'라는은 '조개껍데기'라는 bash
, '''를 할 수 ''zsh
b=$a:l
소문자와
b=$a:u
대문자일 경우.
Bash 5.1은 이 작업을 직접 수행할 수 있는 방법을 제공합니다.L
다음 중 하나:
${var@L}
예를 들어 다음과 같습니다.
v="heLLo"
echo "${v@L}"
# hello
로도 할 수 요.U
:
v="hello"
echo "${v@U}"
# HELLO
첫 .u
:
v="hello"
echo "${v@u}"
# Hello
zsh 단위:
echo $a:u
zsh를 사랑해야 해!
GNU GNU sed
:
sed 's/.*/\L&/'
예:
$ foo="Some STRIng";
$ foo=$(echo "$foo" | sed 's/.*/\L&/')
$ echo "$foo"
some string
Bash 4.0 이전
Bash 문자열 대소문자를 줄이고 변수에 할당
VARIABLE=$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')
echo "$VARIABLE"
Bash 명령줄의 경우 로케일 및 국제문자에 따라서는 (다른 사람의 답변에서) 다음과 같이 동작할 수 있습니다.
$ echo "ABCÆØÅ" | python -c "print(open(0).read().lower())"
abcæøå
$ echo "ABCÆØÅ" | sed 's/./\L&/g'
abcæøå
$ export a="ABCÆØÅ" | echo "${a,,}"
abcæøå
다음과 같은 변형은 작동하지 않을 수 있습니다.
$ echo "ABCÆØÅ" | tr "[:upper:]" "[:lower:]"
abcÆØÅ
$ echo "ABCÆØÅ" | awk '{print tolower($1)}'
abcÆØÅ
$ echo "ABCÆØÅ" | perl -ne 'print lc'
abcÆØÅ
$ echo 'ABCÆØÅ' | dd conv=lcase 2> /dev/null
abcÆØÅ
간단한 방법
echo "Hi all" | awk '{ print tolower($0); }'
내장만 사용하는 표준 셸(배시즘 없음)의 경우:
uppers=ABCDEFGHIJKLMNOPQRSTUVWXYZ
lowers=abcdefghijklmnopqrstuvwxyz
lc(){ #usage: lc "SOME STRING" -> "some string"
i=0
while ([ $i -lt ${#1} ]) do
CUR=${1:$i:1}
case $uppers in
*$CUR*)CUR=${uppers%$CUR*};OUTPUT="${OUTPUT}${lowers:${#CUR}:1}";;
*)OUTPUT="${OUTPUT}$CUR";;
esac
i=$((i+1))
done
echo "${OUTPUT}"
}
대문자일 경우:
uc(){ #usage: uc "some string" -> "SOME STRING"
i=0
while ([ $i -lt ${#1} ]) do
CUR=${1:$i:1}
case $lowers in
*$CUR*)CUR=${lowers%$CUR*};OUTPUT="${OUTPUT}${uppers:${#CUR}:1}";;
*)OUTPUT="${OUTPUT}$CUR";;
esac
i=$((i+1))
done
echo "${OUTPUT}"
}
bash 4에서는 typeset을 사용할 수 있습니다.
예:
A="HELLO WORLD"
typeset -l A=$A
이거 드셔보세요
s="Hello World!"
echo $s # Hello World!
a=${s,,}
echo $a # hello world!
b=${s^^}
echo $b # HELLO WORLD!
참조 : http://wiki.workassis.com/shell-script-convert-text-to-lowercase-and-uppercase/
서 bash
manpage:
${파라미터^pattern}
${parameter^^pattern}
${파라미터, 패턴}
${파라미터, 패턴}
케이스 수정이 확장에 의해 파라미터의 알파벳 문자의 대소문자가 변경됩니다.패턴은 경로 이름 확장과 마찬가지로 패턴을 생성하기 위해 확장됩니다.파라미터의 확장된 값의 각 문자는 패턴에 대해 테스트되며 패턴과 일치하는 경우 대소문자가 변환됩니다.패턴은 여러 문자와 일치해서는 안 됩니다.^ 연산자는 패턴에 일치하는 소문자를 대문자로 변환하고 연산자는 일치하는 대문자를 소문자로 변환합니다.^^ 및 , 확장자는 확장된 값의 일치하는 각 문자를 변환하고, ^ 및 , 확장자는 확장된 값의 첫 번째 문자만 일치하여 변환합니다.패턴을 생략하면 ?와 같이 처리되어 모든 문자와 일치합니다.파라미터가 @ 또는 *인 경우 대소문자 수정 조작이 각 위치 파라미터에 차례로 적용되어 확장 리스트가 됩니다.파라미터가 @ 또는 * 첨자가 붙은 배열 변수인 경우 대/소문자 수정 작업이 배열의 각 멤버에 차례로 적용되어 확장 목록이 됩니다.
정규 표현
제가 공유하고 싶은 명령어는 http://commandlinefu.com에서 취득한 것입니다.그 장점은 만약 당신이cd
모든 파일과 폴더를 소문자로 재귀적으로 변경합니다.의하주뛰어난 명령줄 수정 기능으로 드라이브에 저장된 다수의 앨범에 특히 유용합니다.
find . -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
현재 디렉토리 또는 풀패스를 나타내는 닷(.)의 뒤에 디렉토리를 지정할 수 있습니다.
이 솔루션이 도움이 되기를 바랍니다.이 명령어는 공백에 밑줄을 치환하지 않습니다.다음 기회에 하겠습니다.
대소문자를 변환하는 것은 알파벳에 한합니다.그래서 이게 잘 될 거예요.
알파벳 a-z를 대문자에서 소문자로 변환하는 데 주력하고 있습니다.다른 문자는 그대로 stdout에 인쇄해야 합니다.
a-z 범위 내의 경로/to/file/filename 내의 모든 텍스트를 A-Z로 변환합니다.
소문자를 대문자로 변환하기 위해
cat path/to/file/filename | tr 'a-z' 'A-Z'
대문자에서 소문자로 변환하기 위한
cat path/to/file/filename | tr 'A-Z' 'a-z'
예를들면,
파일 이름:
my name is xyz
변환 대상:
MY NAME IS XYZ
예 2:
echo "my name is 123 karthik" | tr 'a-z' 'A-Z'
# Output:
# MY NAME IS 123 KARTHIK
예 3:
echo "my name is 123 &&^&& #@$#@%%& kAR2~thik" | tr 'a-z' 'A-Z'
# Output:
# MY NAME IS 123 &&^&& #@0@%%& KAR2~THIK
Bash 3.2.+ | Mac의 경우:
read -p 'What is your email? ' email
email=$(echo $email | tr '[:upper:]' '[:lower:]')
email="$email"
echo $email
하여 대답하는 가 많은데, 을 사용하지 않습니다.Bash
.
를 할 수 있는 는, 는 Bash4 의 URL 를 사용해 .${VAR,,}
4 (를 들어 3.하고 있습니다).4 배쉬(Mac) 3.2 배쉬(Bash 3.2)@ghostdog74의 답변 수정 버전을 사용하여 보다 휴대성이 좋은 버전을 만들었습니다.
「 」라고 수 .lowercase 'my STRING'
소문자 버전을 얻습니다.var로 코멘트는 , 은 「var」의 「var」의 「var」의 「var」의 「fortable」은 아닙니다.Bash
끈을 돌려줄 수 없으니까.이치노, 찍기 쉽다, 찍기 쉽다.var="$(lowercase $str)"
구조
각 문자의 정수 을 ASCII로 .printf
and then 그리고 나서.adding 32
if 한다면upper-to->lower
, 「」subtracting 32
if 한다면lower-to->upper
. . Then use 그럼 을 사용해 주세요.printf
번호를 다시 변환하려면 다시 변환합니다.숫자를 다시 문자로 변환합니다.터에서'A' -to-> 'a'
우리는 32 자선단체에 차이가 있다.32살
「」를 사용합니다.printf
★★★★
$ printf "%d\n" "'a"
97
$ printf "%d\n" "'A"
65
97 - 65 = 32
그리고 이것은 예를 들어 작업 중인 버전입니다.
코드의 코멘트는 많은 것을 설명하므로 주의해 주십시오.
#!/bin/bash
# lowerupper.sh
# Prints the lowercase version of a char
lowercaseChar(){
case "$1" in
[A-Z])
n=$(printf "%d" "'$1")
n=$((n+32))
printf \\$(printf "%o" "$n")
;;
*)
printf "%s" "$1"
;;
esac
}
# Prints the lowercase version of a sequence of strings
lowercase() {
word="$@"
for((i=0;i<${#word};i++)); do
ch="${word:$i:1}"
lowercaseChar "$ch"
done
}
# Prints the uppercase version of a char
uppercaseChar(){
case "$1" in
[a-z])
n=$(printf "%d" "'$1")
n=$((n-32))
printf \\$(printf "%o" "$n")
;;
*)
printf "%s" "$1"
;;
esac
}
# Prints the uppercase version of a sequence of strings
uppercase() {
word="$@"
for((i=0;i<${#word};i++)); do
ch="${word:$i:1}"
uppercaseChar "$ch"
done
}
# The functions will not add a new line, so use echo or
# append it if you want a new line after printing
# Printing stuff directly
lowercase "I AM the Walrus!"$'\n'
uppercase "I AM the Walrus!"$'\n'
echo "----------"
# Printing a var
str="A StRing WITH mixed sTUFF!"
lowercase "$str"$'\n'
uppercase "$str"$'\n'
echo "----------"
# Not quoting the var should also work,
# since we use "$@" inside the functions
lowercase $str$'\n'
uppercase $str$'\n'
echo "----------"
# Assigning to a var
myLowerVar="$(lowercase $str)"
myUpperVar="$(uppercase $str)"
echo "myLowerVar: $myLowerVar"
echo "myUpperVar: $myUpperVar"
echo "----------"
# You can even do stuff like
if [[ 'option 2' = "$(lowercase 'OPTION 2')" ]]; then
echo "Fine! All the same!"
else
echo "Ops! Not the same!"
fi
exit 0
실행 후 결과는 다음과 같습니다.
$ ./lowerupper.sh
i am the walrus!
I AM THE WALRUS!
----------
a string with mixed stuff!
A STRING WITH MIXED STUFF!
----------
a string with mixed stuff!
A STRING WITH MIXED STUFF!
----------
myLowerVar: a string with mixed stuff!
myUpperVar: A STRING WITH MIXED STUFF!
----------
Fine! All the same!
이 기능은 ASCII 문자에서만 사용할 수 있습니다.
ASCII를 사용하다
예를 들어 대소문자를 구분하지 않는 CLI 옵션에 사용합니다.
v4를 사용하는 경우, 이것은 내장되어 있습니다.그렇지 않은 경우, 여기에 간단하고 광범위하게 적용할 수 있는 솔루션이 있습니다.이 스레드에 대한 다른 답변(및 댓글)은 아래 코드를 작성하는 데 매우 도움이 되었습니다.
# Like echo, but converts to lowercase
echolcase () {
tr [:upper:] [:lower:] <<< "${*}"
}
# Takes one arg by reference (var name) and makes it lowercase
lcase () {
eval "${1}"=\'$(echo ${!1//\'/"'\''"} | tr [:upper:] [:lower:] )\'
}
주의:
- 행::
a="Hi All"
다음: 그후::lcase a
다음과 같은 작업을 수행합니다.a=$( echolcase "Hi All" )
- 에서는 lcase를 합니다.
${!1//\'/"'\''"}
${!1}
를 사용하면 문자열에 따옴표가 있는 경우에도 이 기능이 작동합니다.
이것은 Jared의 훨씬 빠른 변형입니다.TS486의 어프로치에서는 네이티브 Bash 기능(Bash 버전 <4.0 포함)을 사용하여 어프로치를 최적화합니다.
작은 문자열(25자)과 큰 문자열(445자) 모두 소문자와 대문자 변환에 대해 이 접근방식을 1,000회 반복했습니다.테스트 문자열의 대부분은 소문자이므로 일반적으로 소문자로 변환하는 것이 대문자로 변환하는 것보다 빠릅니다.
3.과 내 은 여기서 더 더 .tr
몇 가지 경우에.
25글자의 1,000회 반복에 대한 타이밍 결과를 다음에 나타냅니다.
- 소문자로 접근하면 0.46초, 대문자로 접근하면 0.96초
- Orwellophile의 소문자 어프로치의 경우 1.16s, 대문자 어프로치의 경우
- (''3.67')
tr
3, 대문자 3.81 - ghostdog74의 소문자 어프로치의 경우 11.12s, 대문자 어프로치의 경우 31.41s
- 테크노사우루스의 소문자 접근법은 26.25초, 대문자 접근법은 26.21초
- Jared의 경우 25.06초TS486의 소문자 접근법, 대문자 27.04s
445자의 1,000회 반복에 대한 타이밍 결과(위터 바이너의 시 "The Robin"으로 구성):
- 소문자에 대해서는 2s, 대문자에 대해서는 12s
- for 의초4
tr
일 경우 , 대문자일 경우 - Orwellophile의 소문자 접근법은 20s, 대문자 접근법은 29
- ghostdog74의 소문자 어프로치는 75s, 대문자 어프로치는 669s.주요 매치가 있는 테스트와 주요 매치가 없는 테스트의 성능 차이가 얼마나 큰지 주목해야 합니다.
- 테크노사우루스의 소문자 접근법은 467s, 대문자 접근법은 449s
- 자레드용 660년대TS486은 소문자로, 660은 대문자로 표기.이 접근법에 의해 Bash에서 연속적인 페이지 장애(메모리 스왑)가 발생했다는 점에 주목해 주십시오.
솔루션:
#!/bin/bash
set -e
set -u
declare LCS="abcdefghijklmnopqrstuvwxyz"
declare UCS="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
function lcase()
{
local TARGET="${1-}"
local UCHAR=''
local UOFFSET=''
while [[ "${TARGET}" =~ ([A-Z]) ]]
do
UCHAR="${BASH_REMATCH[1]}"
UOFFSET="${UCS%%${UCHAR}*}"
TARGET="${TARGET//${UCHAR}/${LCS:${#UOFFSET}:1}}"
done
echo -n "${TARGET}"
}
function ucase()
{
local TARGET="${1-}"
local LCHAR=''
local LOFFSET=''
while [[ "${TARGET}" =~ ([a-z]) ]]
do
LCHAR="${BASH_REMATCH[1]}"
LOFFSET="${LCS%%${LCHAR}*}"
TARGET="${TARGET//${LCHAR}/${UCS:${#LOFFSET}:1}}"
done
echo -n "${TARGET}"
}
방법은 간단합니다.입력 문자열에 남아 있는 대문자가 있는 동안 다음 문자를 찾아 해당 문자의 모든 인스턴스를 소문자 변형으로 바꿉니다.모든 대문자가 바뀔 때까지 반복합니다.
솔루션의 퍼포먼스 특성:
- 셸 빌트인 유틸리티만 사용하여 새로운 프로세스에서 외부 바이너리 유틸리티를 호출하는 오버헤드를 방지합니다.
- 성능 저하를 초래하는 하위 쉘을 방지합니다.
- 변수 내 글로벌 문자열 치환, 변수 서픽스 트리밍, 정규식 검색 및 매칭 등 성능을 위해 컴파일 및 최적화된 셸 메커니즘을 사용합니다.이러한 메커니즘은 문자열을 통해 수동으로 반복하는 것보다 훨씬 빠릅니다.
- 일치하는 고유 문자의 개수에 필요한 횟수만 변환합니다.예를 들어, 대문자가 3개인 문자열을 소문자로 변환하는 데 필요한 루프 반복은 3회뿐입니다.사전 설정된 ASCII 알파벳의 경우 최대 루프 반복 횟수는 26회입니다.
UCS
★★★★★★★★★★★★★★★★★」LCS
할 수 .
그래서 각 유틸리티에 대해 합의된 접근방식을 사용하여 업데이트된 벤치마킹을 수행하려고 했지만 작은 세트를 여러 번 반복하는 대신...
- 멀티바이트로 가득 찬 파일에 입력
Unicode
의 문자UTF-8
부호화, - the를
pipe
I/O는 동등하게 합니다. - <고객명>
LC_ALL=C
surve to level play field(를 확보하기 )
————————————————————————————————————————
다.
bsd-sed
★★★★★★★★★★★★★★★★★」gnu-sed
아주 좋게 말하면, 평범하다.- 말인지 도리가 조차 모른다
bsd-sed
것 요.xxhash
않다
- 말인지 도리가 조차 모른다
python3
유니코드 문자 캐싱을 시도하고 있습니까?- 일 설정을 하고 있습니다만,
LC_ALL=C
)
- 일 설정을 하고 있습니다만,
tr
gnu-tr
지금까지 가장 빠른 속도입니다.bsd-tr
perl5
때보다awk
전체 있는 있는 변종입니다.mawk2
조금perl5
:2.935s mawk2 vs 3.081s perl5
의 범위 내에서
awk
,gnu-gawk
3, 3번 중 것으로 .mawk 1.3.4
(중간에)mawk 1.9.9.6
: fast에 비해 50% :50 % " " " "gawk
(쓸데없는 일에 시간을 낭비하지 않았어요)
.
out9: 1.85GiB 0:00:03 [ 568MiB/s] [ 568MiB/s] [ <=> ]
in0: 1.85GiB 0:00:03 [ 568MiB/s] [ 568MiB/s] [============>] 100%
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C mawk2 '{ print tolower($_) }' FS='^$'; )
mawk 1.9.9.6 (mawk2-beta)
3.07s user 0.66s system 111% cpu 3.348 total
85759a34df874966d096c6529dbfb9d5 stdin
out9: 1.85GiB 0:00:06 [ 297MiB/s] [ 297MiB/s] [ <=> ]
in0: 1.85GiB 0:00:06 [ 297MiB/s] [ 297MiB/s] [============>] 100%
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C mawk '{ print tolower($_) }' FS='^$'; )
mawk 1.3.4
6.01s user 0.83s system 107% cpu 6.368 total
85759a34df874966d096c6529dbfb9d5 stdin
out9: 23.8MiB 0:00:00 [ 238MiB/s] [ 238MiB/s] [ <=> ]
in0: 1.85GiB 0:00:07 [ 244MiB/s] [ 244MiB/s] [============>] 100%
out9: 1.85GiB 0:00:07 [ 244MiB/s] [ 244MiB/s] [ <=> ]
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C gawk -be '{ print tolower($_) }' FS='^$';
GNU Awk 5.1.1, API: 3.1 (GNU MPFR 4.1.0, GNU MP 6.2.1)
7.49s user 0.78s system 106% cpu 7.763 total
85759a34df874966d096c6529dbfb9d5 stdin
out9: 1.85GiB 0:00:03 [ 616MiB/s] [ 616MiB/s] [ <=> ]
in0: 1.85GiB 0:00:03 [ 617MiB/s] [ 617MiB/s] [============>] 100%
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C perl -ne 'print lc'; )
perl5 (revision 5 version 34 subversion 0)
2.70s user 0.85s system 115% cpu 3.081 total
85759a34df874966d096c6529dbfb9d5 stdin
out9: 1.85GiB 0:00:32 [57.4MiB/s] [57.4MiB/s] [ <=> ]
in0: 1.85GiB 0:00:32 [57.4MiB/s] [57.4MiB/s] [============>] 100%
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C gsed 's/.*/\L&/'; ) # GNU-sed
gsed (GNU sed) 4.8
32.57s user 0.97s system 101% cpu 32.982 total
85759a34df874966d096c6529dbfb9d5 stdin
out9: 1.86GiB 0:00:38 [49.7MiB/s] [49.7MiB/s] [ <=> ]
in0: 1.85GiB 0:00:38 [49.4MiB/s] [49.4MiB/s] [============>] 100%
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C sed 's/.*/\L&/'; ) # BSD-sed
37.94s user 0.86s system 101% cpu 38.318 total
d5e2d8487df1136db7c2334a238755c0 stdin
in0: 313MiB 0:00:00 [3.06GiB/s] [3.06GiB/s] [=====>] 16% ETA 0:00:00
out9: 1.85GiB 0:00:11 [ 166MiB/s] [ 166MiB/s] [ <=>]
in0: 1.85GiB 0:00:00 [3.31GiB/s] [3.31GiB/s] [============>] 100%
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C python3 -c "print(open(0).read().lower()))
Python 3.9.12
9.04s user 2.18s system 98% cpu 11.403 total
7ddc0b5cbcfbbfac3c2b6da6731bd262 stdin
out9: 2.51MiB 0:00:00 [25.1MiB/s] [25.1MiB/s] [ <=> ]
in0: 1.85GiB 0:00:11 [ 171MiB/s] [ 171MiB/s] [============>] 100%
out9: 1.85GiB 0:00:11 [ 171MiB/s] [ 171MiB/s] [ <=> ]
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C ruby -pe '$_.downcase!'; )
ruby 2.6.8p205 (2021-07-07 revision 67951) [universal.arm64e-darwin21]
10.46s user 1.23s system 105% cpu 11.073 total
85759a34df874966d096c6529dbfb9d5 stdin
in0: 1.85GiB 0:00:01 [1.01GiB/s] [1.01GiB/s] [============>] 100%
out9: 1.85GiB 0:00:01 [1.01GiB/s] [1.01GiB/s] [ <=> ]
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C gtr '[A-Z]' '[a-z]'; ) # GNU-tr
gtr (GNU coreutils) 9.1
1.11s user 1.21s system 124% cpu 1.855 total
85759a34df874966d096c6529dbfb9d5 stdin
out9: 1.85GiB 0:01:19 [23.7MiB/s] [23.7MiB/s] [ <=> ]
in0: 1.85GiB 0:01:19 [23.7MiB/s] [23.7MiB/s] [============>] 100%
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C tr '[A-Z]' '[a-z]'; ) # BSD-tr
78.94s user 1.50s system 100% cpu 1:19.67 total
85759a34df874966d096c6529dbfb9d5 stdin
( time ( pvE0 < "${m3t}" | LC_ALL=C gdd conv=lcase ) | pvE9 ) | xxh128sum | lgp3; sleep 3;
out9: 0.00 B 0:00:01 [0.00 B/s] [0.00 B/s] [<=> ]
in0: 1.85GiB 0:00:06 [ 295MiB/s] [ 295MiB/s] [============>] 100%
out9: 1.81GiB 0:00:06 [ 392MiB/s] [ 294MiB/s] [ <=> ]
3874110+1 records in
3874110+1 records out
out9: 1.85GiB 0:00:06 [ 295MiB/s] [ 295MiB/s] [ <=> ]
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C gdd conv=lcase; ) # GNU-dd
gdd (coreutils) 9.1
1.93s user 4.35s system 97% cpu 6.413 total
85759a34df874966d096c6529dbfb9d5 stdin
% ( time ( pvE0 < "${m3t}" | LC_ALL=C dd conv=lcase ) | pvE9 ) | xxh128sum | lgp3; sleep 3;
out9: 36.9MiB 0:00:00 [ 368MiB/s] [ 368MiB/s] [ <=> ]
in0: 1.85GiB 0:00:04 [ 393MiB/s] [ 393MiB/s] [============>] 100%
out9: 1.85GiB 0:00:04 [ 393MiB/s] [ 393MiB/s] [ <=> ]
3874110+1 records in
3874110+1 records out
out9: 1.85GiB 0:00:04 [ 393MiB/s] [ 393MiB/s] [ <=> ]
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C dd conv=lcase; ) # BSD-dd
1.92s user 4.24s system 127% cpu 4.817 total
85759a34df874966d096c6529dbfb9d5 stdin
————————————————————————————————————————
mawk2
으로 더 수 perl5
한 하여 ""를 실행함으로써tolower()
모로 보나1.85 GB
Call: Call: Call:
( time ( pvE0 < "${m3t}" |
LC_ALL=C mawk2 '
BEGIN { FS = RS = "^$" }
END { print tolower($(ORS = "")) }'
) | pvE9 ) | xxh128sum| lgp3
in0: 1.85GiB 0:00:00 [3.35GiB/s] [3.35GiB/s] [============>] 100%
out9: 1.85GiB 0:00:02 [ 647MiB/s] [ 647MiB/s] [ <=> ]
( pvE 0.1 in0 < "${m3t}" | LC_ALL=C mawk2 ; )
1.39s user 1.31s system 91% cpu 2.935 total
85759a34df874966d096c6529dbfb9d5 stdin
Bash 4.0 이전 버전의 경우 이 버전이 가장 빠릅니다(명령어를 포크/실행하지 않으므로).
function string.monolithic.tolower
{
local __word=$1
local __len=${#__word}
local __char
local __octal
local __decimal
local __result
for (( i=0; i<__len; i++ ))
do
__char=${__word:$i:1}
case "$__char" in
[A-Z] )
printf -v __decimal '%d' "'$__char"
printf -v __octal '%03o' $(( $__decimal ^ 0x20 ))
printf -v __char \\$__octal
;;
esac
__result+="$__char"
done
REPLY="$__result"
}
테크노사우루스의 대답도 잠재력이 있었습니다. 하지만 미에게는 제대로 작동했죠.
이 질문이 얼마나 오래되었고 테크노사우루스의 대답과 유사함에도 불구하고.이전 버전의 bash뿐만 아니라 대부분의 플랫폼(That I Use)에서 이식 가능한 솔루션을 찾는 데 어려움을 겪었습니다.또, 사소한 변수를 취득하기 위해서, 어레이, 기능, 프린트, 에코, 임시 파일을 사용하는 것에 대해서도 불만을 가지고 있습니다.이것은 나에게 매우 효과가 있습니다.지금까지 공유하려고 했습니다.주요 테스트 환경은 다음과 같습니다.
- GNU bash, 버전 4.1.2 (1)-release (x86_64-redhat-linux-gnu)
- GNU bash, 버전 3.2.57 (1)-release(sparc-sun-solaris2)10)
lcs="abcdefghijklmnopqrstuvwxyz"
ucs="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
input="Change Me To All Capitals"
for (( i=0; i<"${#input}"; i++ )) ; do :
for (( j=0; j<"${#lcs}"; j++ )) ; do :
if [[ "${input:$i:1}" == "${lcs:$j:1}" ]] ; then
input="${input/${input:$i:1}/${ucs:$j:1}}"
fi
done
done
스트링 내에서 루프를 반복하기 위한 단순 C 스타일.이런 거 처음 보셨다면 여기서 배웠어요.이 경우 행은 입력에 char ${input:$i:1}(소문자)가 존재하는지 여부를 확인하고, 존재하면 지정된 char ${ucs로 대체합니다.$j:1}(대문자)를 입력에 저장합니다.
input="${input/${input:$i:1}/${ucs:$j:1}}"
변환된 문자열을 변수에 저장합니다.팔로잉은 나에게 효과가 있었다-$SOURCE_NAME
로로 합니다.$TARGET_NAME
TARGET_NAME="`echo $SOURCE_NAME | tr '[:upper:]' '[:lower:]'`"
[dev@localhost ~]$ TEST=STRESS2
[dev@localhost ~]$ echo ${TEST,,}
stress2
Dejay Clayton의 뛰어난 솔루션을 기반으로 대소문자를 전치함수로 일반화하고(단독적으로 유용), 결과를 변수(고속/안전)로 반환하고, BASH v4+ 최적화를 추가했습니다.
pkg::transpose() { # <retvar> <string> <from> <to>
local __r=$2 __m __p
while [[ ${__r} =~ ([$3]) ]]; do
__m="${BASH_REMATCH[1]}"; __p="${3%${__m}*}"
__r="${__r//${__m}/${4:${#__p}:1}}"
done
printf -v "$1" "%s" "${__r}"
}
pkg::lowercase() { # <retvar> <string>
if (( BASH_VERSINFO[0] >= 4 )); then
printf -v "$1" "%s" "${2,,}"
else
pkg::transpose "$1" "$2" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
"abcdefghijklmnopqrstuvwxyz"
fi
}
pkg::uppercase() { # <retvar> <string>
if (( BASH_VERSINFO[0] >= 4 )); then
printf -v "$1" "%s" "${2^^}"
else
pkg::transpose "$1" "$2" "abcdefghijklmnopqrstuvwxyz" \
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
fi
}
간단하게 하기 위해서, set -e 서포트(또는 에러 체크)를 추가하지 않았습니다.하지만 그 외에는 쉘가이드를 따르고 있습니다.pkg::transpose()
는, 「의 경합을 .printf -v
더 않아요?shell variable(s)
+declare
+eval
+single quote escapes
+echo
+pipe(s)
+tr
서브셸이나 외부 프로세스를 피하기 위해?
# ***MUCH*** faster for ASCII only mawk '$!NF = toupper($_)' <<< 'abcxyz'
ABCXYZ
gawk '$_ = tolower($_)' <<< 'FAB-EDC'
fab-edc
유니코드도 마찬가지로 사용하기 쉽고 바이트의 '언패킹'이나 '엔코드'나 '디코딩'도 필요 없습니다.
printf '%s' "${test_utf8}" | ……
1 ÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øù
úûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪī
ĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝ
ŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƀƁƂƃƄƅƆƇƈƉƊƋƌƍƎƏ
ƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿǀǁǂ
ǃDŽDždžLJLjljNJNjnjǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴ
…… | gawk '$_ = toupper($_)'
1 ÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ÷ØÙ
ÚÛÜÝÞŸĀĀĂĂĄĄĆĆĈĈĊĊČČĎĎĐĐĒĒĔĔĖĖĘĘĚĚĜĜĞĞĠĠĢĢĤĤĦĦĨĨĪĪ
ĬĬĮĮİIIJIJĴĴĶĶĸĹĹĻĻĽĽĿĿŁŁŃŃŅŅŇŇʼnŊŊŌŌŎŎŐŐŒŒŔŔŖŖŘŘŚŚŜŜ
ŞŞŠŠŢŢŤŤŦŦŨŨŪŪŬŬŮŮŰŰŲŲŴŴŶŶŸŹŹŻŻŽŽSƀƁƂƂƄƄƆƇƇƉƊƋƋƍƎƏ
ƐƑƑƓƔǶƖƗƘƘƚƛƜƝȠƟƠƠƢƢƤƤƦƧƧƩƪƫƬƬƮƯƯƱƲƳƳƵƵƷƸƸƺƻƼƼƾǷǀǁǂ
ǃDŽDžDŽLJLjLJNJNjNJǍǍǏǏǑǑǓǓǕǕǗǗǙǙǛǛƎǞǞǠǠǢǢǤǤǦǦǨǨǪǪǬǬǮǮǰDZDzDZǴ
이 명령어를 사용하여 같은 작업을 수행합니다.이 명령어는 대문자의 문자열을 소문자로 변환합니다.
sed 's/[A-Z]/[a-z]/g' <filename>
언급URL : https://stackoverflow.com/questions/2264428/how-to-convert-a-string-to-lower-case-in-bash
'source' 카테고리의 다른 글
Excel 공식에서 문자열 분할 함수 시뮬레이션 (0) | 2023.04.12 |
---|---|
Windows 명령 프롬프트에서 특정 디렉터리의 파일/하위 폴더를 삭제하는 방법 (0) | 2023.04.12 |
대신 아이콘 태그를 사용해야 합니까? (0) | 2023.04.12 |
SQL Server management studio에서 DATETIME을 사용하여 삽입하려면 어떻게 해야 합니까? (0) | 2023.04.12 |
2개의 뷰 컨트롤러 간에 통신하도록 단순 대리인을 설정하려면 어떻게 해야 합니까? (0) | 2023.04.12 |