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

Resuelto assassin asked hace 14 años • 29 respuestas

¿Hay alguna manera de entrar?intento¿Convertir una cadena en una cadena en minúscula?

Por ejemplo, si tengo:

a="Hi all"

Quiero convertirlo a:

"hi all"
assassin avatar Feb 15 '10 14:02 assassin
Aceptado

Hay varias maneras:

estándar POSIX

tr

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

AWK

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

No POSIX

Puede encontrarse con problemas de portabilidad con los siguientes ejemplos:

Golpe 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

perla

$ 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

Nota: YMMV en este. No me funciona (GNU bash versión 4.2.46 y 4.0.33 (y el mismo comportamiento 2.05b.0 pero nocasematch no está implementado)) incluso con el uso de shopt -u nocasematch;. Desarmar eso nocasematchhace [[ "fooBaR" == "FOObar" ]]que coincida OK PERO dentro de las mayúsculas y minúsculas, extrañamente, [b-z]no coinciden incorrectamente con [A-Z]. ¡Bash está confundido por el doble negativo ("desarmar nocasematch")! :-)

ghostdog74 avatar Feb 15 '2010 07:02 ghostdog74

En fiesta 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 desactivar un declareatributo, utilice +. Por ejemplo, declare +c string. Esto afecta a las asignaciones posteriores y no al valor actual.

Las declareopciones cambian el atributo de la variable, pero no el contenido. Las reasignaciones en mis ejemplos actualizan el contenido para mostrar los cambios.

Editar:

Se agregó "alternar el primer carácter por palabra" ( ${var~}) como lo sugiere ghostdog74 .

Editar: Se corrigió el comportamiento de la tilde para que coincida con Bash 4.3.

Dennis Williamson avatar Feb 15 '2010 10:02 Dennis Williamson