Apa artinya mengganti garis miring (/) dengan tanda seru (!) Dalam perintah pengganti?

13

Baru-baru ini saya melihat perintah pengganti di mana penulis telah /diganti dengan !seperti ini::s!abc!ABC!g

Saya mencoba menemukan beberapa dokumentasi tentang penggunaan ini tetapi saya tidak menemukan sesuatu yang relevan. Jadi saya mencoba bereksperimen sendiri dan sekali lagi saya tidak bisa menemukan perbedaan nyata antara kedua tanda tersebut. Inilah yang saya temukan:

  • Tidak mungkin mencampur !dan /menjalankan perintah. Misalnya :s!abc/ABCgagal.
  • Mungkin bermanfaat untuk digunakan !agar tidak keluar /dari pola. Misalnya jika saya ingin mengganti </dengan yang %bisa saya gunakan :%s!</!%!gsebagai ganti :%s/<\//%/g.
  • Tampaknya dalam beberapa kasus beberapa regex tidak akan bekerja dengan /dan berfungsi dengan baik !tetapi karena saya tidak benar-benar ahli regex saya tidak yakin akan hal itu.

Jadi pertanyaan saya sederhana: Apa keuntungan menggunakan !perintah pengganti dan kapan saya harus memutuskan untuk menggunakannya /?

statox
sumber
Pertanyaan ini juga diposting ke Stack Overflow
Martin Tournoij
Memang saya membuat posting ganda karena kesalahan, saya menandai beberapa menit yang lalu untuk mengetahui apa yang harus saya lakukan.
statox

Jawaban:

22

Dari :help :global:

Alih-alih '/' yang mengelilingi {pattern}, Anda dapat menggunakan karakter byte tunggal lainnya, tetapi bukan karakter alfabet, '\', '"' atau '|'. Ini berguna jika Anda ingin menyertakan '/' di pola pencarian atau string pengganti.

Seperti yang sudah Anda rancang dari eksperimen Anda, ini untuk mencegah apa yang disebut " leaning toothpick syndrome ". Pertimbangkan ini:

:%s/\/home\/martin\/test/\/home\/jake\/x/

melawan:

:%s!/home/martin/test!/home/jake/x!

Bentuk kedua jelas jauh lebih mudah dibaca.

Ini adalah satu-satunya alasan Anda dapat mengubah pembatas; untuk membuatnya lebih mudah dibaca bagi kita manusia. Komputer tidak peduli.

Beberapa program lain bahkan lebih fleksibel, di GNU sedmisalnya Anda dapat digunakan xsebagai pembatas jika Anda mau. sed sxaxbxg filesama dengan sed s/a/b/g file.

Martin Tournoij
sumber
Adapun keterbacaan, saya lebih suka (dan menyarankan) :%s@/home/martin/test@/home/jake/x@, karena "gemuk" @membuatnya lebih mudah untuk melihat di mana masing-masing bagian pernyataan dimulai / berakhir.
DevSolar
@DevSolar saya menemukan :%s#/home/martin/test#/home/jake/x#karya lebih baik, tapi itu hanya pendapat pribadi.
Amit Gold