Changer la casse de la nième lettre dans une chaîne

8

Je souhaite modifier le cas de la lettre n-ième d'une chaîne dans BASH(ou tout autre * outils nix, par exemple sed, awk, tr, etc.).

Je sais que vous pouvez changer la casse d'une chaîne entière en utilisant:

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

Est-il possible de changer la casse de la 3ème lettre de "Test" en majuscule?

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

Réponses:

5

En bash, vous pourriez faire:

$ 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

Ou

$ perl -ple 's/(..)(.)/$1.uc($2)/e; ' <<<$str
abCdefgh
terdon
la source
1
À quoi sert ~en perlsolution?
cuonglm
@cuonglm une faute de frappe. Il est resté d'un versin précédent que j'ai essayé où j'utilisais à la $ARGV[0]=~place <<<$str. Merci.
terdon
2
Le bashpeut être raccourci avec foo=${str:2}et ${foo^}, qui ne met en majuscule que le premier caractère de la chaîne.
chepner
7

Avec GNU sed(éventuellement d'autres)

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

Avec awk

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

Un autre perl:

$ str="abcdefgh"
$ perl -pe 'substr($_,2,1) ^= " "' <<<"$str"
abCdefgh
  • La forme générale est substr($_,n,1)nest la position de la lettre que vous souhaitez inverser la casse (index basé sur 0).

  • Lorsque vous xor un caractère ASCII avec espace, vous inversez sa casse.

cuonglm
la source
C'est vraiment cool, je ne savais pas que xor-ing un caractère ascii avec l'espace inverse son cas.
ryanmjacobs