Cambiar mayúsculas y minúsculas de la enésima letra en una cadena

Cambiar mayúsculas y minúsculas de la enésima letra en una cadena

Quiero cambiar el caso de la enésima letra de una cadena en BASH(o cualquier otra herramienta *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úscula?

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

Respuesta1

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

Respuesta2

Con GNU sed(posiblemente otros)

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

Conawk

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

Respuesta3

Otro perl:

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

  • Cuando codificas un carácter ASCII con un espacio, inviertes su mayúsculas y minúsculas.

información relacionada