source

Bash에서 문자열을 소문자로 변환하는 방법

ittop 2023. 4. 12. 23:01
반응형

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회 반복에 대한 타이밍 결과를 다음에 나타냅니다.

445자의 1,000회 반복에 대한 타이밍 결과(위터 바이너의 시 "The Robin"으로 구성):

  • 소문자에 대해서는 2s, 대문자에 대해서는 12s
  • for 의초4tr일 경우 , 대문자일 경우
  • 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}"
}

방법은 간단합니다.입력 문자열에 남아 있는 대문자가 있는 동안 다음 문자를 찾아 해당 문자의 모든 인스턴스를 소문자 변형으로 바꿉니다.모든 대문자가 바뀔 때까지 반복합니다.

솔루션의 퍼포먼스 특성:

  1. 셸 빌트인 유틸리티만 사용하여 새로운 프로세스에서 외부 바이너리 유틸리티를 호출하는 오버헤드를 방지합니다.
  2. 성능 저하를 초래하는 하위 쉘을 방지합니다.
  3. 변수 내 글로벌 문자열 치환, 변수 서픽스 트리밍, 정규식 검색 및 매칭 등 성능을 위해 컴파일 및 최적화된 셸 메커니즘을 사용합니다.이러한 메커니즘은 문자열을 통해 수동으로 반복하는 것보다 훨씬 빠릅니다.
  4. 일치하는 고유 문자의 개수에 필요한 횟수만 변환합니다.예를 들어, 대문자가 3개인 문자열을 소문자로 변환하는 데 필요한 루프 반복은 3회뿐입니다.사전 설정된 ASCII 알파벳의 경우 최대 루프 반복 횟수는 26회입니다.
  5. UCS ★★★★★★★★★★★★★★★★★」LCS할 수 .

그래서 각 유틸리티에 대해 합의된 접근방식을 사용하여 업데이트된 벤치마킹을 수행하려고 했지만 작은 세트를 여러 번 반복하는 대신...

  1. 멀티바이트로 가득 찬 파일에 입력Unicode의 문자UTF-8 부호화,
  2. the를 pipe I/O는 동등하게 합니다.
  3. <고객명>LC_ALL=C surve to level play field(를 확보하기 )

————————————————————————————————————————

  • 다.bsd-sed ★★★★★★★★★★★★★★★★★」gnu-sed아주 좋게 말하면, 평범하다.

    • 말인지 도리가 조차 모른다bsd-sed 것 요.xxhash 않다
  • python3유니코드 문자 캐싱을 시도하고 있습니까?

    • 일 설정을 하고 있습니다만,LC_ALL=C)
  • tr

    1. gnu-tr지금까지 가장 빠른 속도입니다.
    2. bsd-tr
  • perl5 때보다 awk전체 있는 있는 변종입니다.mawk2 조금 perl5:

      2.935s mawk2 
    vs
      3.081s perl5
    
  • 의 범위 내에서awk,gnu-gawk3, 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)에서 이식 가능한 솔루션을 찾는 데 어려움을 겪었습니다.또, 사소한 변수를 취득하기 위해서, 어레이, 기능, 프린트, 에코, 임시 파일을 사용하는 것에 대해서도 불만을 가지고 있습니다.이것은 나에게 매우 효과가 있습니다.지금까지 공유하려고 했습니다.주요 테스트 환경은 다음과 같습니다.

  1. GNU bash, 버전 4.1.2 (1)-release (x86_64-redhat-linux-gnu)
  2. 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

반응형