Cambiar mayúsculas y minúsculas en una cadena

8

Quiero cambiar el caso de la letra n-ésima de una cadena en BASH(o cualquier otra herramienta de * nix, por ejemplo sed, awk, tr, etc.).

Sé que puedes cambiar el caso de una cadena completa usando:

${str,,} # to lowercase
${str^^} # to uppercase

¿Es posible cambiar el caso de la tercera letra de "Prueba" a mayúsculas?

$ export str="Test"
$ echo ${str^^:3}
TeSt
ryanmjacobs
fuente

Respuestas:

5

En bash podrías hacer:

$ str="abcdefgh"
$ foo=${str:2}  # from the 3rd letter to the end
echo ${str:0:2}${foo^} # take the first three letters from str and capitalize the first letter in foo.
abCdefgh

En perl:

$ perl -ple 's/(?<=..)(.)/uc($1)/e; ' <<<$str
abCdefgh

O

$ perl -ple 's/(..)(.)/$1.uc($2)/e; ' <<<$str
abCdefgh
terdon
fuente
1
¿Cuál es el propósito de ~en perlsolución?
Cuonglm
@cuonglm un error tipográfico. Quedaba de una versión anterior que probé donde estaba usando en $ARGV[0]=~lugar de <<<$str. Gracias.
terdon
2
Se bashpuede acortar con foo=${str:2}y ${foo^}, que solo capitaliza el primer carácter de la cadena.
chepner
7

Con GNU sed(posiblemente otros)

sed 's/./\U&/3' <<< "$str"

Con awk

awk -vFS= -vOFS= '{$3=toupper($3)}1' <<< "$str"
conductor de acero
fuente
1

Otro perl:

$ str="abcdefgh"
$ perl -pe 'substr($_,2,1) ^= " "' <<<"$str"
abCdefgh
  • La forma general es substr($_,n,1)dónde nestá la posición de la letra que desea invertir el caso (índice basado en 0).

  • Cuando crea un carácter ASCII con espacio, invierte su mayúscula.

Cuonglm
fuente
Eso es realmente genial, no sabía que hacer un personaje ascii con espacio invierte su caso.
ryanmjacobs