Ändern Sie die Groß- und Kleinschreibung des n-ten Buchstabens in einer Zeichenfolge

8

Ich mag den Fall der n-ten Buchstaben einer Zeichenfolge ändern in BASH(oder andere * nix - Tool, zum Beispiel sed, awk, trusw.).

Ich weiß, dass Sie den Fall einer ganzen Zeichenfolge ändern können, indem Sie:

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

Ist es möglich, den Fall des 3. Buchstabens von "Test" in Großbuchstaben zu ändern?

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

Antworten:

5

In Bash könnten Sie tun:

$ 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

Oder

$ perl -ple 's/(..)(.)/$1.uc($2)/e; ' <<<$str
abCdefgh
terdon
quelle
1
Was ist Zweck ~in perlLösung?
Cuonglm
@cuonglm ein Tippfehler. Es wurde von einer früheren übrig versin Ich habe versucht , wo ich war mit $ARGV[0]=~statt <<<$str. Vielen Dank.
Terdon
2
Das bashkann mit foo=${str:2}und gekürzt werden ${foo^}, wodurch nur das erste Zeichen in der Zeichenfolge großgeschrieben wird.
Chepner
7

Mit GNU sed(möglicherweise andere)

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

Mit awk

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

Ein anderer perl:

$ str="abcdefgh"
$ perl -pe 'substr($_,2,1) ^= " "' <<<"$str"
abCdefgh
  • Die allgemeine Form ist , substr($_,n,1)wo nist die Position des Buchstaben Sie den Fall invertieren möchten (0-basierender Index).

  • Wenn Sie ein ASCII-Zeichen mit Leerzeichen xorieren, kehren Sie dessen Groß- und Kleinschreibung um.

cuonglm
quelle
Das ist wirklich cool, ich wusste nicht, dass das Xoring eines ASCII-Charakters mit Leerzeichen seinen Fall umkehrt.
Ryanmjacobs