Изменить регистр n-й буквы в строке

Изменить регистр n-й буквы в строке

Я хочу изменить регистр n-й буквы строки в BASH(или любых других инструментах *nix, например sed, awk, , tr, и т. д.).

Я знаю, что можно изменить регистр целой строки, используя:

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

Можно ли изменить регистр третьей буквы в слове «Test» на заглавную?

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

решение1

В bash вы можете сделать:

$ 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

В Perl:

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

Или

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

решение2

С GNU sed(возможно и другими)

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

Сawk

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

решение3

Другой perl:

$ str="abcdefgh"
$ perl -pe 'substr($_,2,1) ^= " "' <<<"$str"
abCdefgh
  • Общая форма выглядит так: substr($_,n,1)где n— позиция буквы, регистр которой необходимо инвертировать (индекс начинается с 0).

  • При выполнении операции xor над символом ASCII и пробелом вы меняете его регистр на противоположный.

Связанный контент