Frage Wie konvertiert man eine Zeichenkette in Bash in Kleinbuchstaben?


Gibt es einen Weg hinein?  um einen String in einen Kleinbuchstaben umzuwandeln?

Zum Beispiel, wenn ich:

a="Hi all"

Ich möchte es konvertieren zu:

"hi all"

913
2018-02-15 07:02


Ursprung


Antworten:


Es gibt verschiedene Möglichkeiten:

tr

$ echo "$a" | tr '[:upper:]' '[:lower:]'
hi all

AWK

$ echo "$a" | awk '{print tolower($0)}'
hi all

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

Perl

$ echo "$a" | perl -ne 'print lc'
hi all

Bash

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

1581
2018-02-15 07:43



In Bash 4:

In Kleinbuchstaben

$ 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

In Großbuchstaben

$ 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

Toggle (undokumentiert, aber optional zur Kompilierzeit konfigurierbar)

$ 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

Großbuchstaben (undokumentiert, aber zur Kompilierzeit optional konfigurierbar)

$ string="a few words"
$ declare -c string
$ string=$string
$ echo "$string"
A few words

Titel Fall:

$ 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

Um a auszuschalten declare Attribut, verwenden +. Beispielsweise, declare +c string. Dies betrifft nachfolgende Zuordnungen und nicht den aktuellen Wert.

Das declare Optionen ändern das Attribut der Variablen, aber nicht den Inhalt. Die Neuzuweisungen in meinen Beispielen aktualisieren den Inhalt, um die Änderungen anzuzeigen.

Bearbeiten:

Hinzugefügt "togle zuerst Zeichen für Wort" (${var~}) wie von vorgeschlagen Geisterhund74.

Bearbeiten: Das Tilde-Verhalten wurde korrigiert, um Bash 4.3 zu entsprechen.


350
2018-02-15 10:31



echo "Hi All" | tr "[:upper:]" "[:lower:]"

108
2018-02-15 07:13



tr:

a="$(tr [A-Z] [a-z] <<< "$a")"

AWK:

{ print tolower($0) }

sed:

y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/

70
2018-02-15 07:03



Ich weiß, dass dies ein alter Beitrag ist, aber ich habe diese Antwort für eine andere Seite gemacht, also dachte ich, ich würde es hier posten:

OBEN -> niedriger: benutze python:

b=`echo "print '$a'.lower()" | python`

Oder Rubin:

b=`echo "print '$a'.downcase" | ruby`

Oder Perl (wahrscheinlich mein Favorit):

b=`perl -e "print lc('$a');"`

Oder PHP:

b=`php -r "print strtolower('$a');"`

Oder Awk:

b=`echo "$a" | awk '{ print tolower($1) }'`

Oder Sed:

b=`echo "$a" | sed 's/./\L&/g'`

Oder Bash 4:

b=${a,,}

Oder NodeJS wenn du es hast (und ein bisschen verrückt bist ...):

b=`echo "console.log('$a'.toLowerCase());" | node`

Du könntest auch benutzen dd (aber ich würde nicht!):

b=`echo "$a" | dd  conv=lcase 2> /dev/null`

niedriger -> OBEN:

benutze python:

b=`echo "print '$a'.upper()" | python`

Oder Rubin:

b=`echo "print '$a'.upcase" | ruby`

Oder Perl (wahrscheinlich mein Favorit):

b=`perl -e "print uc('$a');"`

Oder PHP:

b=`php -r "print strtoupper('$a');"`

Oder Awk:

b=`echo "$a" | awk '{ print toupper($1) }'`

Oder Sed:

b=`echo "$a" | sed 's/./\U&/g'`

Oder Bash 4:

b=${a^^}

Oder NodeJS wenn du es hast (und ein bisschen verrückt bist ...):

b=`echo "console.log('$a'.toUpperCase());" | node`

Du könntest auch benutzen dd (aber ich würde nicht!):

b=`echo "$a" | dd  conv=ucase 2> /dev/null`

Auch wenn du 'Shell' sagst, nehme ich an, du meinst es bash aber wenn du es benutzen kannst zsh es ist so einfach wie

b=$a:l

für Kleinbuchstaben und

b=$a:u

für Großbuchstaben.


35
2018-05-14 09:36



In zsh:

echo $a:u

Muss zsh lieben!


25
2018-01-27 05:37



Mit GNU sed:

sed 's/.*/\L&/'

Beispiel:

$ foo="Some STRIng";
$ foo=$(echo "$foo" | sed 's/.*/\L&/')
$ echo "$foo"
some string

16
2017-09-26 15:45



Für eine Standard-Shell (ohne Bashismen), die nur Builtins verwendet:

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}"
}

Und für Großbuchstaben:

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}"
}

11
2018-01-21 10:27