¿Comando para convertir una cadena en mayúsculas a minúsculas?

Respuestas:

59

Si la cadena ya está almacenada en una variable, puede usar bashla expansión de parámetros, específicamente ${parameter,,pattern}(disponible desde bash 4.0), donde parameterestá el nombre de su variable y patternse omite:

$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!

Tenga en cuenta que esto no cambia el valor de la variable, solo la salida. Para cambiar la variable, debe asignar el nuevo valor:

$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!

La conversión de mayúsculas funciona con ${parameter^^pattern}:

$ echo ${string^^}
HELLO, WORLD!

Esto también funciona con cadenas Unicode (al menos con las versiones actuales de bash, probablemente necesite al menos bash 4.3):

$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ

Si está usando zsh, puede usar los indicadores de expansión de parámetros ( ${(FLAGS)NAME}disponibles desde zsh 2.5) para lograr los mismos resultados. La bashsintaxis no funciona en zsh 1) . La bandera para minúsculas es L; para mayúsculas es U:

$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"

Esto también funciona con cadenas Unicode (al menos desde zsh 5.0; no probé con versiones anteriores):

$ string='ἈΛΦΆβητος'
$ echo ${(L)string} 
ἀλφάβητος
$ echo ${(U)string}  
ἈΛΦΆΒΗΤΟΣ



1) Aunque, viendo que zsh tenía esto por mucho más tiempo, probablemente debería ser: "la zshsintaxis no funciona"bash .

Adaephon
fuente
3
La ${string,,}notación solo existe para bash versión 4+. De lo contrario, se requiere una de las otras soluciones, como $(echo $string | tr '[:upper:]' '[:lower:]').
Quinn Commandado
40

Hay muy pocos métodos que funcionan correctamente con Unicode:

GNU sed 4.2.2 funciona :

$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ

bash 4.2.45 declarar no funciona:

$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą

La expansión de parámetros bash 4.2.45 no funciona:

$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą

bash 4.3.42 declarey trabajo de expansión de parámetros :

$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką

GNU tr 8.20 no funciona:

$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą

mawk (awk predeterminado en Ubuntu 13.10) no funciona:

$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą

gawk funciona :

$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ

Perl pure uc () no funciona:

$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą

Python 2 sin ninguna sugerencia de Unicode no funciona:

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą

Python 2 cuando se le indica que trate con trabajos Unicode :

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ

Python 3 funciona :

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ
Michał Šrajer
fuente
1
En Ubuntu 13.04, tengo gawkel awk predeterminado (como se muestra con update-alternatives --display awk). ¿Estás seguro de que mawkes el predeterminado en 13.10?
kiri
seds desde 1990 han apoyado la \Uopción ;-). No es una característica específica de gnu-sed. De lo contrario, gran respuesta, tantas opciones, tan poco tiempo ;-) ¡Buena suerte a todos!
Shellter
Además, habrá algunos problemas con el turco (con puntos y sin puntos i), para obtener más información sobre los siguientes enlaces: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/… - en.wikipedia. org / wiki / Dotted_and_dotless_I
azat
En su ejemplo, el bolso ucno funciona en Perl porque tiene que hacerlo use Encodeo use utf8. Reescribe tu ejemplo como echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'y funcionará. Ver también stackoverflow.com/a/13261662/3701431
Sergiy Kolodyazhnyy
20

Me gustaría utilizar la interna fiesta de composición tipográfica o declarar comando para definir una variable en minúscula.

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case

Los caracteres se reducen cuando se establece el valor, no cuando se escribe la variable. Por lo tanto, es mejor escribir al principio del guión. Para mayúsculas puede escribir -u .

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE

Esto no es específico para bash shell, que también funciona en ksh, tal vez está en la definición de shell POSIX.

EDITAR: Mucha gente me señaló gentilmente el hecho de que la composición tipográfica ahora se considera obsoleta en bash y se reemplaza por declare . Ambos comandos son equivalentes.

$ help typeset
typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.

    Obsolete.  See `help declare'.


$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
    Set variable values and attributes.

Yo sigo usando la sintaxis de composición tipográfica mientras trabajo en un entorno heterogéneo, por lo que no tengo que reescribir mis scripts.

Emmanuel
fuente
2
+1 Increíble, ¡nunca lo supe! por cierto algo de información extra: Miré esto en el manual y parece que typesetse considera depricated y sustituido pordeclare
Thom
1
@ Gracias, parece que bash comenzó a tener una vida lejos de sus "raíces de concha de bourne" :)
Emmanuel
17

Puedes hacerlo con el trcomando.

En la terminal ( Ctrl+ Alt+ T)

Este comando:

echo 'String here' | tr "[:lower:]" "[:upper:]"

convertirá minúsculas a mayúsculas.

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"

convertirá mayúsculas a minúsculas.

Ejemplo:

ingrese la descripción de la imagen aquí

El crédito va a la ciberciudad

rɑːdʒɑ
fuente
2
Si no te importan las configuraciones regionales, tr A-Z a-ztambién funcionará.
Nick Matteo
9

También puedes canalizar las cosas sed:

$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE

Y \Ltendrá el efecto contrario:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase
Oli
fuente
1

No es una solución de bash puro, pero puede canalizar sus cadenas perl(como hizo Olised ):

$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE

Y \Ltendrá el efecto contrario:

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
Sylvain Pineau
fuente
-1

Utilice este comando simple Para mayúsculas y minúsculas Donde 'f' es el nombre del archivo donde desea realizar la conversión.

tr "A-Z" "a-z" < f

Para minúsculas a mayúsculas

tr "a-z" "A-Z" < f
Jack
fuente
1
Como se señaló en un comentario sobre una respuesta anterior , esto no funcionará para algunas configuraciones regionales.
muru