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

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

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"

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.


C'est vraiment cool, je ne savais pas que xor-ing un caractère ascii avec l'espace inverse son cas.
ryanmjacobs
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.