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)où 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.