Saya punya dua file konfigurasi, yang asli dari manajer paket dan yang disesuaikan dimodifikasi oleh saya sendiri. Saya telah menambahkan beberapa komentar untuk menggambarkan perilaku.
Bagaimana saya bisa menjalankan diff
file konfigurasi, melewatkan komentar? Baris yang dikomentari ditentukan oleh:
- spasi kosong opsional (tab dan spasi) opsional
- tanda pagar (
#
) - karakter apa pun lainnya
Ekspresi reguler (paling sederhana) yang melewatkan persyaratan pertama adalah #.*
. Saya mencoba opsi --ignore-matching-lines=RE
( -I RE
) dari GNU diff 3.0, tetapi saya tidak bisa membuatnya bekerja dengan RE itu. Saya juga mencoba .*#.*
dan .*\#.*
tidak berhasil. Secara harfiah menempatkan garis ( Port 631
) karena RE
tidak cocok dengan apa pun, juga tidak membantu menempatkan RE di antara garis miring.
Seperti yang disarankan dalam rasa "beda" alat regex tampaknya kurang? , Saya mencoba grep -G
:
grep -G '#.*' file
Ini sepertinya cocok dengan komentar, tetapi tidak berhasil diff -I '#.*' file1 file2
.
Jadi, bagaimana seharusnya opsi ini digunakan? Bagaimana saya bisa diff
melewati baris tertentu (dalam kasus saya, komentar)? Tolong jangan menyarankan grep
file dan membandingkan file sementara.
sumber
-I
pilihan menyebabkan blok untuk diabaikan hanya jika semua lini cocok regexp. Jadi Anda dapat mengabaikan perubahan hanya-komentar seperti itu, tetapi bukan perubahan komentar yang dekat dengan perubahan non-komentar.diff -I
tidak berperilaku seperti yang saya harapkan. Saya memperbarui jawaban saya dengan contoh yang menjelaskan perilaku ini untuk saya.Jawaban:
Menurut Gilles,
-I
opsi hanya mengabaikan garis jika tidak ada yang lain di dalam set yang cocok kecuali untuk pertandingan-I
. Saya tidak sepenuhnya mendapatkannya sampai saya mengujinya.Ujian
Tiga file terlibat dalam pengujian saya:
File
test1
:File
test2
:File
test3
:Perintah:
Cara alternatif
Karena tidak ada jawaban sejauh ini menjelaskan cara menggunakan
-I
opsi dengan benar, saya akan memberikan alternatif yang bekerja di shell bash:diff -u
- unified diff-B
- abaikan garis kosong<(command)
- fitur bash yang disebut substitusi proses yang membuka deskriptor file untuk perintah, ini menghilangkan kebutuhan untuk file sementaragrep
- perintah untuk mencetak garis (bukan) yang cocok dengan suatu pola-v
- tampilkan garis yang tidak cocokE
- Gunakan persamaan reguler yang diperluas'^\s*(#|$)'
- ekspresi reguler yang cocok dengan komentar dan baris kosong^
- cocok dengan awal garis\s*
- cocokkan spasi putih (tab dan spasi) jika ada(#|$)
cocok dengan tanda pagar, atau sebagai alternatif, akhir barissumber
Mencoba:
Harap dicatat bahwa regex harus cocok dengan baris yang sesuai di kedua file dan cocok dengan setiap baris yang diubah di bongkahan agar berfungsi, jika tidak maka masih akan menunjukkan perbedaan.
Gunakan tanda kutip tunggal untuk melindungi pola dari pengembangan shell dan untuk menghindari karakter yang dicadangkan oleh regex (mis. Tanda kurung).
Kita bisa membaca secara
diffutils
manual:Perilaku ini juga dijelaskan dengan baik oleh Armel di sini .
Terkait: Bagaimana saya bisa melakukan diff yang mengabaikan semua komentar?
sumber
Setelah mencari di web, cara alternatif Lekensteyn adalah yang lebih baik yang saya temukan.
Tapi saya ingin menggunakan keluaran dif sebagai patch ... dan ada masalah karena nomor baris dicatat karena "grep -v".
Jadi saya bermaksud untuk meningkatkan baris perintah ini:
Itu tidak sempurna tetapi nomor baris disimpan dalam file tambalan.
Namun, jika baris baru ditambahkan sebagai ganti baris komentar ... komentar akan menghasilkan Hunk GAGAL saat menambal seperti yang dapat kita lihat di bawah.
uji sekarang perintah kami
/ dev / fd / 62 & / dev / fd / 63 adalah file yang diproduksi oleh substitusi proses. Baris antara "+ baris baru" dan "-lain teks" adalah karakter spasi default yang ditentukan dalam ekspresi sed kami untuk mengganti komentar.
Dan sekarang, apa yang terjadi ketika kita menerapkan tambalan ini:
Solusinya adalah jangan menggunakan format unified diff tanpa -u
sekarang menambal file yang berfungsi (tanpa jaminan hasil dalam proses diff yang sangat kompleks).
sumber
diff -U0 one two
untuk menonaktifkan konteks. Untuk menambal, ada banyak alat yang mungkin lebih cocok seperti kdiff3.-U0
opsi untuk menonaktifkan konteks. Catatan: kdiff3 adalah alat grafis. Saya memerlukan alat otomatis untuk mengelola atribut git merge.vimdiff
mendukung penggabungan tiga arah, mungkin layak untuk dilihat.Saya biasanya mengabaikan kekacauan ini oleh:
grep -v "^#" | cat -s
dan ...vim -d
untuk melihat file. Penyorotan sintaks menangani membuat perbedaan komentar vs non-komentar cukup jelas. Sorotan perbedaan perbedaan in-line sehingga Anda dapat melihat nilai atau bagian nilai apa yang telah diubah sekilas menjadikan ini favorit saya.sumber
Inilah yang saya gunakan untuk menghapus semua baris yang dikomentari -bahkan yang dimulai dengan tab atau spasi- dan yang kosong:
atau kamu bisa melakukannya
sumber