Saya memiliki kode sumber yang tersebar di beberapa file.
- Ini memiliki pola
abcdef
yang harus saya gantipqrstuvxyz
. - Polanya bisa
Abcdef
(Kasus Kalimat) maka perlu digantiPqrstuvxyz
. - Polanya bisa
AbCdEf
(Toggle case) maka perlu digantiPqRsTuVxYz
.
Singkatnya, saya harus mencocokkan kasus pola sumber dan menerapkan pola tujuan yang sesuai.
Bagaimana saya bisa mencapai ini menggunakan sed
atau alat lain?
text-processing
sed
awk
pengguna1263746
sumber
sumber
ABcDeF
?ABcDeF
->PQrStUvxyz
, maka pastiAbCdEf
->PqRsTuvxyz
akan konsisten secara logis. Jika kasing akan disalin dari satu string ke yang lain, apa yang harus terjadi jika string pengganti yang kedua lebih panjang.Jawaban:
Solusi portabel menggunakan
sed
:Lebih mudah dengan sed GNU:
Dengan menggunakan di
&&&
atas, kami menggunakan kembali pola case string untuk sisa penggantian, JadiABcdef
akan diubah kePQrstuVWx
danAbCdEf
kePqRsTuVwX
. Ubah untuk&
hanya mempengaruhi huruf 6 karakter pertama.(catatan bahwa hal itu tidak mungkin melakukan apa yang Anda inginkan atau mungkin mengalami infinite loop jika penggantian dapat dikenakan substitusi (misalnya jika mengganti
foo
untukfoo
, ataubcd
untukabcd
)sumber
Solusi portabel menggunakan
awk
:Input contoh:
Contoh output:
Memperbarui
Seperti yang ditunjukkan dalam komentar, hal di atas hanya akan menggantikan instance pertama dari
find
setiap baris. Untuk mengganti semua instance:Input contoh:
Contoh output:
sumber
Anda bisa menggunakannya
perl
. Langsung dari faq - mengutip dariperldoc perlfaq6
:Bagaimana cara mengganti case-insensitive pada LHS sambil mempertahankan case pada RHS?
Inilah solusi Perlish yang bagus dari Larry Rosler. Ini mengeksploitasi properti bitwise xor pada string ASCII.
Dan ini dia sebagai subrutin, dimodelkan seperti di atas:
Ini mencetak:
Sebagai alternatif, untuk menjaga huruf pengganti kata jika lebih panjang dari aslinya, Anda dapat menggunakan kode ini, oleh Jeff Pinyan:
Ini mengubah kalimat menjadi "ini adalah kasus SUcCess."
Hanya untuk menunjukkan bahwa pemrogram C dapat menulis C dalam bahasa pemrograman apa pun, jika Anda lebih suka solusi yang lebih mirip C, skrip berikut membuat substitusi memiliki kasus yang sama, huruf per huruf, seperti aslinya. (Ini juga terjadi untuk menjalankan sekitar 240% lebih lambat daripada berjalan solusi Perlish.) Jika substitusi memiliki karakter lebih dari string yang diganti, kasus karakter terakhir digunakan untuk sisa substitusi.
sumber
Jika Anda memotong pengganti ke
pqrstu
, coba ini:Memasukkan:
Ouput:
Jika Anda ingin mengganti dengan
prstuvxyz
, mungkin ini:Saya tidak dapat menemukan aturan apa pun untuk dipetakan
ABcDeF
->PQrStUvxyz
.sumber
Sesuatu seperti ini akan melakukan apa yang Anda gambarkan.
sumber