Cómo convertir una cadena a minúsculas en Bash
¿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"
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 nocasematch
hace [[ "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")! :-)
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 declare
atributo, utilice +
. Por ejemplo, declare +c string
. Esto afecta a las asignaciones posteriores y no al valor actual.
Las declare
opciones 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.