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

8

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

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

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

Можно ли изменить регистр 3-й буквы «Тест» в верхний регистр?

$ export str="Test"
$ echo ${str^^:3}
TeSt
ryanmjacobs
источник

Ответы:

5

В 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
Тердон
источник
1
Какова цель ~в perlрешении?
Cuonglm
@cuonglm опечатка. Это было перенесено из предыдущей версии, которую я попробовал, где я использовал $ARGV[0]=~вместо <<<$str. Спасибо.
Terdon
2
bashМожет быть сокращено с foo=${str:2}и ${foo^}, что заглавным только первым символом в строке.
chepner
7

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

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

С awk

awk -vFS= -vOFS= '{$3=toupper($3)}1' <<< "$str"
steeldriver
источник
1

Другое perl:

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

  • Когда вы добавляете символ ASCII с пробелом, вы обращаете его регистр.

cuonglm
источник
Это действительно круто, я не знал, что перестановка символа ascii с помощью пробела инвертирует его регистр.
ryanmjacobs