Thay đổi trường hợp của chữ cái thứ n trong một chuỗi


8

Tôi muốn thay đổi trường hợp của chữ n-thứ của một chuỗi trong BASH(hoặc bất kỳ công cụ * nix khác, ví dụ như sed, awk, tr, vv).

Tôi biết rằng bạn có thể thay đổi trường hợp toàn bộ chuỗi bằng cách sử dụng:

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

Có thể thay đổi trường hợp của chữ "Kiểm tra" thứ 3 thành chữ hoa không?

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

Câu trả lời:


5

Trong bash bạn có thể làm:

$ 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

Trong Perl:

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

Hoặc là

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

1
Mục đích là gì ~trong perlgiải pháp?
cuonglm

@cuonglm một lỗi đánh máy. Nó còn sót lại từ một phiên bản trước tôi đã thử nơi tôi đang sử dụng $ARGV[0]=~thay vì <<<$str. Cảm ơn.
terdon

2
bashthể rút ngắn với foo=${str:2}${foo^}, chỉ viết hoa ký tự đầu tiên trong chuỗi.
chepner

7

Với GNU sed(có thể là những người khác)

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

Với awk

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

1

Khác perl:

$ str="abcdefgh"
$ perl -pe 'substr($_,2,1) ^= " "' <<<"$str"
abCdefgh
  • Dạng tổng quát là substr($_,n,1)nơi nlà vị trí của lá thư bạn muốn đảo ngược trường hợp (chỉ số dựa trên 0).

  • Khi bạn xor một ký tự ASCII có khoảng trắng, bạn đảo ngược trường hợp của nó.


Điều đó thật tuyệt, tôi không biết rằng xor-ing một nhân vật ascii với không gian đảo ngược trường hợp của nó.
ryanmjacobs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.