Alterar maiúsculas e minúsculas da n-ésima letra em uma sequência

8

Eu quero mudar o tamanho da letra n-th de uma corda em BASH(ou quaisquer outras ferramentas * nix, por exemplo sed, awk, tr, etc).

Eu sei que você pode alterar o caso de uma string inteira usando:

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

É possível alterar a caixa da terceira letra de "Teste" para maiúscula?

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

Respostas:

5

No bash, você pode fazer:

$ 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

Em Perl:

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

Ou

$ perl -ple 's/(..)(.)/$1.uc($2)/e; ' <<<$str
abCdefgh
terdon
fonte
1
Qual é o propósito de ~, em perlsolução?
cuonglm
@cuonglm um erro de digitação. Foi remanescente de uma versão anterior que tentei onde estava usando em $ARGV[0]=~vez de <<<$str. Obrigado.
terdon
2
O bashpode ser encurtado com foo=${str:2}e ${foo^}, que apenas coloca em maiúscula o primeiro caractere na sequência.
chepner
7

Com o GNU sed(possivelmente outros)

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

Com awk

awk -vFS= -vOFS= '{$3=toupper($3)}1' <<< "$str"
chave de aço
fonte
1

Outro perl:

$ str="abcdefgh"
$ perl -pe 'substr($_,2,1) ^= " "' <<<"$str"
abCdefgh
  • A forma geral é substr($_,n,1)onde nestá a posição da letra que você deseja inverter o caso (índice baseado em 0).

  • Quando você xou um caractere ASCII com espaço, inverte seu caso.

cuonglm
fonte
Isso é muito legal, eu não sabia que xor um personagem ascii com espaço inverte seu caso.
Ryanmjacobs