Cambia il caso della lettera n-esima in una stringa


8

Voglio cambiare il caso della lettera n-esima di una stringa in BASH(o altri programmi di * nix, ad esempio sed, awk, tr, ecc).

So che puoi cambiare il caso di un'intera stringa usando:

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

È possibile cambiare il maiuscolo della 3a lettera di "Test" in maiuscolo?

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

Risposte:


5

In bash potresti fare:

$ 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

In Perl:

$ perl -ple 's/(?<=..)(.)/uc($1)/e; ' <<<$str
abCdefgh

O

$ perl -ple 's/(..)(.)/$1.uc($2)/e; ' <<<$str
abCdefgh

1
Qual è lo scopo di ~in perlsolution?
cuonglm,

@cuonglm a typo. È stato lasciato da un versin precedente che ho provato dove stavo usando $ARGV[0]=~invece di <<<$str. Grazie.
terdon

2
È bashpossibile abbreviare con foo=${str:2}e ${foo^}, che consente di scrivere in maiuscolo solo il primo carattere nella stringa.
Chepner,

7

Con GNU sed(forse altri)

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

Con awk

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

1

Un altro perl:

$ str="abcdefgh"
$ perl -pe 'substr($_,2,1) ^= " "' <<<"$str"
abCdefgh
  • La forma generale è substr($_,n,1)dove si ntrova la posizione della lettera che si desidera invertire il caso (indice basato su 0).

  • Quando si xor un carattere ASCII con spazio, si inverte il suo caso.


È davvero bello, non sapevo che xoring un personaggio ASCII con spazio inverte il suo caso.
ryanmjacobs,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.