Pregunta ¿Cómo convertir una cadena a minúsculas en Bash?


¿Hay alguna manera de  para convertir una cadena en una cadena de minúsculas?

Por ejemplo, si tengo:

a="Hi all"

Quiero convertirlo a:

"hi all"

913
2018-02-15 07:02


origen


Respuestas:


Las son varias maneras:

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

Intento

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



En Bash 4:

A minúsculas

$ 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

A mayúsculas

$ 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

Alternar (no documentado, pero opcionalmente configurable en tiempo de compilación)

$ 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

Capitalizar (no documentado, pero opcionalmente configurable en tiempo de compilación)

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

Titulo del caso:

$ 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

Para apagar una declare atributo, uso +. Por ejemplo, declare +c string. Esto afecta asignaciones posteriores y no el valor actual.

los declare las opciones cambian el atributo de la variable, pero no los contenidos. Las reasignaciones en mis ejemplos actualizan los contenidos para mostrar los cambios.

Editar:

Se agregó "alternar el primer carácter por palabra" (${var~}) según lo sugerido por ghostdog74.

Editar: Comportamiento de tilde corregido para que coincida con Bash 4.3.


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



Sé que esta es una publicación antigua pero hice esta respuesta para otro sitio, así que pensé en publicarla aquí:

SUPERIOR -> inferior: usar python:

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

O Ruby:

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

O Perl (probablemente mi favorito):

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

O PHP:

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

O Awk:

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

O Sed:

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

O Bash 4:

b=${a,,}

O NodeJS si lo tienes (y estás un poco loco ...):

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

También podrías usar dd (¡pero no lo haría!):

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

inferior -> SUPERIOR:

usar python:

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

O Ruby:

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

O Perl (probablemente mi favorito):

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

O PHP:

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

O Awk:

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

O Sed:

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

O Bash 4:

b=${a^^}

O NodeJS si lo tienes (y estás un poco loco ...):

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

También podrías usar dd (¡pero no lo haría!):

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

También cuando dices 'shell' supongo que te refieres bash pero si puedes usar zsh es tan fácil como

b=$a:l

para minúsculas y

b=$a:u

para mayúsculas


35
2018-05-14 09:36



En zsh:

echo $a:u

Tengo que amar a zsh!


25
2018-01-27 05:37



Usando GNU sed:

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

Ejemplo:

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

16
2017-09-26 15:45



Para un shell estándar (sin bashisms) usando solo builtins:

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

Y para mayúsculas:

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