Saya memiliki file dengan banyak pengguna default. Saya ingin mengubah beberapa teks, tapi saya kesulitan membuat korek api dan mengganti. Menggunakan contoh berikut:
###############################################################################
# Trackpad, mouse, keyboard, Bluetooth accessories, and input #
###############################################################################
# Trackpad: enable tap to click for this user and for the login screen
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
Saya ingin mengganti # Trackpad: ...
denganrunning "Trackpad: ..."
Memecah masalah, saya datang dengan sesuatu menggunakan penguji regex:
/\n\n#\s(.*)/g
Jika saya mencoba dan menggunakan ini di Vim, itu tidak berfungsi untuk saya:
:/\n\n#\s(.*)/running "\1"/g
Saya kira masalah saya bermuara pada dua pertanyaan spesifik:
- Bagaimana saya bisa menghindari mencari
\n
karakter, dan sebaliknya memastikan#
tidak muncul di akhir grup pencarian? - Bagaimana saya bisa secara efektif menggunakan kelompok tangkap?
Ada beberapa jawaban bagus di bawah ini. Sulit untuk memilih di antara ketiganya, namun saya merasa jawaban yang dipilih adalah yang paling akurat untuk spesifikasi asli saya. Saya sarankan Anda mencoba ketiga jawaban dengan file yang sebenarnya untuk melihat bagaimana perasaan Anda tentang mereka.
sumber
:%s/\v\n\n#\s+(.*)/^M^Mrunning "\1"/
(menambahkan bendera "ajaib"). Sangat sulit untuk memilih jawaban yang benar untuk pertanyaan awal saya, tetapi saya merasa jawaban ini adalah yang paling dekat dengan jawaban asli saya yang diharapkan. Ini juga satu-satunya yang berfungsi di seluruh file tanpa perlu memilih rentang.\r
daripada^M
mendapatkan baris baru?Saya akan menggunakan sesuatu seperti:
^#
untuk mencocokkan#
karakter berlabuh di awal baris (ini menjawab pertanyaan 1)\s\+
untuk mencocokkan spasi putih satu kali atau lebih\(
untuk memulai grup (ini menjawab pertanyaan 2).\{-}\
untuk mencocokkan karakter 0 atau lebih banyak kali dengan cara yang tidak serakah ; ini berbeda dari.*
yang mencoba untuk mencocokkan sesedikit mungkin, dan tidak sebanyak mungkin. Coba tambahkan:
karakter dalam komentar untuk melihat mengapa ini penting\)
untuk mengakhiri subkelompok.:
cocok dengan literal:
Kami kemudian mengganti ini dengan teks yang Anda inginkan, dan gunakan
\1
untuk merujuk ke grup yang kami tangkap.Sintaks ekspresi reguler sedikit mirip dengan sintaksis wiki: ada banyak dari mereka, mereka semua terlihat sama dalam sekejap, tidak ada yang jelas lebih baik daripada yang lain, tetapi ada banyak perbedaan.
Saat ini, ekspresi reguler yang disebut "Perl-kompatibel" adalah default de-facto di sebagian besar bahasa, tetapi ekspresi reguler Vim tidak kompatibel dengan ekspresi yang kompatibel dengan Perl! Sintaks regim Vim kembali ke setidaknya 70-an, ketika Perl bahkan tidak ada.
Anda dapat melihat ini dengan subkelompok, di mana Anda harus menggunakan
\(
dan tidak(
(ini kompatibel dengan sintaksis POSIX 'dasar', tetapi tidak dengan sintaksis POSIX 'extended' atau sintaks Perl yang lebih umum). Anda dapat mengontrol ini dengan menambahkan\v
bendera dalam pola (Lihat:help /\v
untuk detail), ini akan membuatnya "lebih kompatibel", tetapi tidak sepenuhnya (Anda masih harus menggunakan.{-}
untuk pertandingan yang tidak serakah misalnya)Jadi ini mungkin menjelaskan mengapa menggunakan "tester regex" hampir, tetapi tidak cukup, berfungsi.
http://www.vimregex.com/ sebagai ikhtisar / cheatsheet yang baik dari Vim regexps.
sumber
:
. Lihat file lengkap untuk detail github.com/squarefrog/dotfiles/blob/master/osx/…Kamu bisa:
#
::/[^#]$/
#\s(.*)
di awal baris:s/\v^#\s(.*)/running "\1"/
Untuk menggunakan grup, Anda harus:
\(.*\)
atau\v
:s/\v...
Menggabungkannya:
sumber