
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)
donden
está 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.