Perbedaan spasi putih antara dua file di Linux

15

Saya memiliki dua file yang ketika saya bandingkan dengan diff menunjukkan bahwa setiap baris telah berubah. Ketika saya membandingkannya dengan diff -w(mengabaikan spasi) itu menunjukkan beberapa perubahan minimal yang saya harapkan.

Jelas ada beberapa perbedaan antara spasi putih di setiap file, tapi saya tidak tahu apa itu atau bagaimana menemukannya. Saya telah mencoba mengedit file untuk memastikan bahwa spasi sebenarnya adalah karakter spasi (sebagai lawan tab) tetapi tidak yakin apa yang harus dilakukan.

Saya telah menggunakan vim dengan :set list onuntuk mengkonfirmasi bahwa tidak ada spasi tambahan di akhir baris.

Saya juga percaya bahwa setiap file memiliki terminator garis Linux karena vim tidak menunjukkan ^Mdi akhir baris.

Romski
sumber
1
Sudahkah Anda memeriksa jejak spasi (di akhir baris)? Ruang seperti itu akan dideteksi oleh difftetapi banyak editor tidak, secara default, membuat ruang ini terlihat.
John1024
Saran yang bagus Saya menggunakan vim dengan ": set list on" ini menunjukkan "$" pada akhir baris dan tidak ada spasi tambahan. Saya akan memperbarui pertanyaan saya
Romski
Jika Anda seorang vimpengguna, maka sudahkah Anda mencoba menggunakan vimdiff file1 file2untuk melihat perbedaannya?
John1024
@ John1024 Saya tidak menyadari vimdiff, tetapi terlihat menjanjikan. Tambahkan sebagai jawaban dan saya akan menerimanya
Romski
1
Vim menunjukkan ^ M hanya ketika kesalahan mendeteksi akhir baris Unix tetapi file sebenarnya memiliki akhir baris DOS. Biasanya ini terjadi jika Anda memiliki baris campuran yang diakhiri dalam satu file, misalnya menerapkan tambalan dengan akhiran baris yang berbeda dari file asli. Ketika vim mendeteksi baris DOS berakhir dengan benar, itu tidak akan menunjukkan ^ M.
Lie Ryan

Jawaban:

7

Untuk vimpengguna, ada utilitas praktis untuk menunjukkan perbedaan yang tepat antara file:

vimdiff file1 file2

Ini akan menempatkan setiap file di windows, berdampingan, dan perbedaan dengan warna yang disorot.

Beberapa perintah berguna saat masuk vimdiff

Sementara di vimdiff, beberapa perintah yang berguna adalah:

  • ]c: lompat ke perubahan berikutnya

  • [c: lompat ke perubahan sebelumnya

  • ctrl-W ctrl-W: beralih ke jendela lain

  • zo: lipatan terbuka

  • zc: tutup lipatan

Contoh

Berikut adalah contoh vimdiffdalam xtermmembandingkan dua versi cupsfile konfigurasi:

masukkan deskripsi gambar di sini

Anda dapat melihat bahwa bagian panjang dari garis yang identik telah diciutkan. Mereka dapat dibuka kembali dengan zo.

Skema warna akan bervariasi tergantung pada pengaturan opsi Anda. Dalam contoh di atas, ketika sebuah baris muncul di satu file tetapi tidak yang lain, baris itu diberi latar belakang biru gelap. Di file lain, garis yang hilang ditandai dengan garis putus-putus. Ketika sebuah garis muncul di kedua file tetapi memiliki beberapa perbedaan, bagian-bagian yang tidak berubah dari garis memiliki latar belakang merah muda dan bagian yang diubah memiliki latar belakang merah.

John1024
sumber
14

Pada FreeBSD atau kebanyakan sistem Linux, Anda dapat menyalurkan output diff cat -v -e -tuntuk menunjukkan perbedaan spasi putih.

diff file1 file2 | cat -vet

Tab akan ditampilkan sebagai ^I, a $akan ditampilkan di akhir setiap baris sehingga Anda dapat melihat spasi spasi, dan karakter yang tidak tercetak akan ditampilkan sebagai ^Xatau M-X.

Jika Anda memiliki GNU coreutils (tersedia di sebagian besar distribusi Linux non-busybox), ini dapat disederhanakan menjadi

diff file1 file2 | cat -A

Pada sistem busybox, gunakan catv -vet.

Tandai Plotnick
sumber
2

Apakah salah satu file diedit pada mesin Windows?

Pengakhiran jalur standar pada Windows adalah CRLF, di mana di Linux itu hanya LF (dan pada Mac dulu CR, tapi saya curiga itu berubah sejak OS X).

Coba wc -lpada file dan lihat berapa banyak baris, kemudian lihat apakah perbedaan ukurannya sama dengan jumlah baris (baris terakhir mungkin tidak diakhiri dalam satu file).

fencepost
sumber
Terima kasih atas balasan cepatnya. Melakukan penghitungan baris menunjukkan bahwa satu file memiliki 5 baris lagi (saya perkirakan ini karena saya telah mengedit). Saya mendapat satu file dari mesin Linux dan yang lainnya diperiksa dari repositori kode ke Linux. Saya percaya bahwa melihat file dengan terminator Windows di vim akan menunjukkan karakter terakhir sebagai ^ M dan bukan itu masalahnya.
Romski
3
vim sebenarnya cukup pintar untuk mendeteksi secara otomatis pemutusan saluran, lihat stackoverflow.com/questions/3852868 untuk detailnya.
fencepost
Aku tidak menyadari itu sebelumnya! Saya akan memeriksa ulang
Romski
2

odmungkin membantu. Perintah Octal Dump dapat menampilkan konten dalam heksadesimal. Ini dapat membantu Anda melihat byte apa, termasuk byte nol atau spasi putih tak terduga, dalam file. Kemungkinan penyebab umum mungkin LF vs CRLF, tab vs spasi, atau ASCII vs Unicode (yang mungkin sering hanya memiliki byte nol sebelum setiap byte yang biasanya terlihat). od -x filenameharus mengungkapkan pola-pola itu. Jika Anda ingin cara yang lebih rumit untuk melihat file, "hex editor" apa pun dapat melakukannya dengan baik. Yang menyenangkan tentang oditu, seperti cutperintah, itu dibangun ke banyak sistem Unix. Jadi, seringkali, tidak diperlukan instalasi terpisah.

Jika Anda membutuhkan file agar lebih mirip, trdapat membuat beberapa perubahan, dan seddapat membuat lebih banyak. Saya mungkin akan mulai dengan ls -lmelihat file mana yang lebih besar, kemudian melihat byte untuk melihat apa yang perlu diubah, dan kemudian mengubah salah satu file sehingga mereka tampak lebih mirip.

TOOGAM
sumber
1

Untuk mengetahui di mana spasi dan tab sebenarnya, Anda dapat menggantinya dengan menggunakan sedmisalnya:

$ cat file
  line 1
  line 2
    line 6
        line 7
$ sed 's/ /-/g; s/\t/<tab>/g' file
--line-1
--line-2
<tab>line-6
<tab><tab>line-7

Dan sekarang bandingkan dua file tersebut.

kekacauan
sumber
Bahkan lebih baik, Anda bisa menjalankan filter itu pada output diff. Atau Anda dapat menggunakan filter yang sudah jadi di cat, seperti di superuser.com/a/913368/37154
clacke
0

Konten berikut disalin di sini dari bagian "pertanyaan" di atas, yang ditulis oleh Romski.

Keduanya vimdiffdan diff file1 file2 | cat -Asangat berguna dari perspektif alat.

Terakhir, saya menemukan satu masalah lagi. Beberapa file saya dikodekan dengan UTF-8 BOM. Ini disorot menggunakan diff file1 file2 | cat -A. Ini memanifestasikan dirinya sebagai M-oM-;M-?pada awal file yang terpengaruh:

$ diff file1 file2 | cat -A
< package com.mycompany;$
---$
> M-oM-;M-?package com.mycompany;$

Meskipun ada sejumlah masalah, saya telah mencantumkan beberapa perintah di bawah ini untuk mereka yang perlu membersihkan file-file mereka:

# recursively remove UTF8 BOM
find . -type f -exec sed -i -e '1s/^\xEF\xBB\xBF//' {} \;

# recursively replace CRLF with LF
find . -type f -print0 | xargs -0 dos2unix
Kevin Panko
sumber