
Я хочу изменить регистр 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 и пробелом вы меняете его регистр на противоположный.