Apakah ada cara bagaimana huruf besar / kecil hanya satu karakter dalam beberapa string?
Contoh Input:
syslog_apr_24_30
syslog_mar_01_17
Output yang diinginkan:
syslog_Apr_24_30
syslog_Mar_01_17
Harap dicatat huruf besar awal bulan.
Saya sudah mencoba awk
tetapi saya tidak cukup baik untuk membuatnya bekerja.
sed 's/_./\U&/'
awk:
sumber
Awk
versi dengan substring dan toupperContoh dijalankan:
sumber
Menggunakan
awk
:atau
Contoh
sumber
Inilah pendekatan Perl:
The
-p
menyebabkan setiap baris untuk dicetak setelah menerapkan script yang diberikan oleh-e
. Substitusi menggantikan instance pertama_
dan karakter yang mengikutinya dengan diri mereka sendiri ($&
adalah apa pun yang cocok) huruf besar (uc()
),e
pada akhir operator substitusi (s///e
) diperlukan untuk mengevaluasi ekspresi.sumber
Lainnya
perl
:sumber
Pure Bash 4.x, menggunakan regex untuk memilih bagian yang ingin Anda kirimi huruf besar, dan
^^
operator huruf besar pada bagian itu. Memaku di bagian depan dan belakang (dicocokkan dengan. *) Untuk membuat kembali seluruh string:Jika Anda tidak mengingat semua aturan penawaran, aman untuk mengutip semuanya kecuali regex (yang akan membuat
=~
pencocokan string secara literal).The
^
Operator upcase-pertama hanya bekerja pada awal variabel (atau elemen array). Dan sepertinya tidak ada ekspansi substring yang memberi Anda apa perl akan memanggil nilai (yang dapat Anda tetapkan / modifikasi). Operator naik / turun pertama dapat mengambil pola yang cocok pada basis per karakter, tetapi itu tidak membantu melompatisyslog_
, karena ada nama bulan yang dimulai dengan karakter dalam "syslog".Bagaimanapun, ini mungkin lebih cepat daripada
foo="$(echo "$foo" | sed 's/_./\U&/')"
(diposting sebagai komentar untuk jawaban yang diterima, oleh Glenn Jackman).Bash, sed, atau awk akan BANYAK kali lebih cepat dari perl. Jika Anda mulai menemukan beberapa perl satu-liners yang berguna dalam skrip shell, Anda harus menulis semuanya dalam perl.
sumber
Jika bulan selalu mengikuti "_" pertama (garis bawah), maka gunakan ini (seperti yang ditunjukkan dalam jawaban lain):
Jika mungkin ada garis bawah lainnya sebelum yang sebelum bulan maka di atas tidak akan berfungsi.
Jika bulan selalu dimulai dengan karakter ke-8, gunakan ini:
sumber