Jika saya memiliki string yang terlihat seperti ini:
"this_is_the_string"
Di dalam skrip bash, saya ingin mengonversinya menjadi PascalCase, yaitu UpperCamelCase agar terlihat seperti ini:
"ThisIsTheString"
Saya menemukan bahwa mengonversi ke lowerCamelCase dapat dilakukan seperti ini:
"this_is_the_string" | sed -r 's/([a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/'
Sayangnya saya tidak cukup akrab dengan regex untuk memodifikasi ini.
shell-script
pengguna1135541
sumber
sumber
\U\2
memasukkan teks yang ditemukan dari grup kedua, dikonversi ke ALL CAPS. Bandingkan dengan\u\2
, yang menyisipkan teks dalam huruf Kalimat, dengan hanya karakter pertama yang ditulis dengan huruf kapital. (2) Semua contoh yang diberikan di bawah ini akan menerjemahkan "this_is_a_string" menjadi "ThisIsAString" - yang Anda minta, tetapi agak sulit dibaca. Anda mungkin ingin merevisi persyaratan Anda untuk huruf khusus satu kata (substring). … (Lanjutan)(^|_)
ke(\<|_)
.Jawaban:
Ganti pola
(^|_)
pada awal string atau setelah underscore - grup pertama([a-z])
huruf kecil satu - grup keduadengan
\U\2
huruf besar grup keduag
secara global.sumber
\U
adalah ekstensi GNU ke POSIX.sed -r 's/(^|[-_ ]+)([0-9a-z])/\U\2/g'
. Jadi string seperti "this_is_2nd_string" juga berfungsi.Karena Anda menggunakan
bash
, jika Anda menyimpan string dalam variabel, Anda juga dapat melakukannya hanya shell:${uscore//_/ }
mengganti semua_
dengan spasi,(....)
memisahkan string menjadi array,${arr[@]^}
mengubah huruf pertama dari setiap elemen menjadi huruf besar dan kemudianprintf %s ..
mencetak semua elemen satu demi satu.Anda dapat menyimpan string yang dikunci unta ke variabel lain:
dan gunakan / gunakan kembali nanti, misalnya:
Atau, dengan
zsh
:(${(s:_:)uscore})
memisahkan string_
menjadi sebuah array,(C)
huruf besar huruf pertama dari setiap elemen danprintf %s ...
mencetak semua elemen satu demi satu ..Untuk menyimpannya dalam variabel lain yang bisa Anda gunakan
(j::)
untuk bergabung dengan elemen:dan gunakan / gunakan kembali nanti:
sumber
Inilah cara Perl:
Itu dapat menangani string yang panjangnya berubah-ubah:
Ini akan cocok dengan karakter apa pun (
.
) yang muncul setelah dimulainya string atau garis bawah ((^|_)
) dan menggantinya dengan versi huruf besar dari dirinya sendiri (uc($&)
). Ini$&
adalah variabel khusus yang berisi apa pun yang baru saja cocok. Padae
akhirs///ge
memungkinkan penggunaan ekspresi (uc()
fungsi dalam kasus ini) dalam substitusi dang
membuatnya menggantikan semua kemunculan dalam baris. Substitusi kedua menghilangkan garis bawah.sumber
perl -pe 's/(^|_)([a-z])/uc($2)/ge'
Tidak perlu untuk mewakili seluruh string dalam kecocokan ekspresi reguler - sed memiliki
/g
pengubah yang memungkinkan Anda untuk melewati beberapa pertandingan dan mengganti masing-masing:Regex pertama adalah
_\([a-z]\)
- setiap huruf setelah garis bawah; yang kedua cocok dengan huruf pertama dalam sebuah string.sumber
Saya hanya memasukkan jawaban ini karena lebih pendek dan lebih sederhana daripada yang lain sejauh ini.
Dikatakan: huruf besar, karakter mengikuti
_
atau awal. Non huruf tidak akan diubah, karena tidak ada huruf besar.sumber
FooBar
tetapi garis bawah harus dihapus sesuai instruksi. Seperti yang saya pahami instruksinya._
) alih-alih ditunjukkan oleh transisi kasus. Mengingat bahwa, "FOO_BAR" → "FOOBAR" jelas salah (karena membuang informasi pemecah kata), meskipun "FOO_BAR" → "FooBar" mungkin benar. (4) Demikian pula, pemetaan yang menyebabkan tabrakan tampaknya bertentangan dengan semangat pertanyaan. Sebagai contoh, saya percaya bahwa jawaban yang mengubah "DO_SPORTS" dan "DOS_PORTS" ke target yang sama salah.Dalam perl:
Ini juga bisa i18n:
sumber
Saya melakukannya dengan cara ini:
dan dapatkan hasil ini:
sumber