Perbedaan hanya menunjukkan perbedaan di dalam baris


9

Saya ingin membandingkan baris dalam dua file, tetapi untuk meminimalkan noise pada output, saya hanya ingin perbedaan garis yang sebenarnya untuk dicetak.

Misalnya, mengingat dua file di bawah ini:

a.txt

a b c d e f g h i j k l m n o p q r s t u v w x y z

b.txt

a B c d e f g h i j k l m n o p q r s t u v w x y z

(Perbedaan antara mereka adalah kasus surat b)

Saya ingin hasilnya seperti:

[-b-]{+B+}

Saat ini, pendekatan terbaik yang saya temukan adalah menggunakan git diff --word-diff, tetapi output keseluruhan baris:

a [-b-]{+B+} c d e f g h i j k l m n o p q r s t u v w x y z

Apakah ada cara yang lebih langsung untuk melakukannya, selain parsing output secara manual? Juga, idealnya saya lebih suka menggunakan sesuatu yang lebih umum tersedia daripada git diff, misalnya alat shell POSIX yang tidak akan mengharuskan pengguna untuk menginstal paket tambahan.


Akan lebih baik jika Anda menggunakan contoh di mana perbedaannya lebih terlihat. Saya harus menyipitkan mata untuk melihat bahwa kedua karakter itu tidak sama.
Barmar

Maaf, saya menambahkan catatan yang menjelaskan perbedaan antara garis-garis.
anol

Mengapa tidak menggunakan saja bdan Bitu sudah jelas? Saya mengerti bahwa ini mungkin perbedaan yang sebenarnya, tetapi untuk tujuan pertanyaan Anda dapat membuatnya lebih mudah.
Barmar

1
Saya ingin menghindari solusi yang hanya akan berfungsi pada karakter ASCII, tetapi karena solusi yang diajukan tidak bergantung padanya, saya mengubahnya. Namun, saya tidak dapat memperbarui jawaban untuk mencerminkan perubahan baru karena hasil edit akan lebih kecil dari 6 karakter.
anol

Jawaban:


14

Menggunakan wdiff :

$ wdiff -3 a.txt b.txt

======================================================================
 [-b-] {+B+}
======================================================================

The -3atau ---no-commonopsi akan menghapus kata-kata yang umum antara dua file dan hanya menunjukkan perbedaan.

The ===...banner (dan baris kosong) dapat dihapus dengan grep:

$ wdiff -3 a.txt b.txt | grep -vx '=*'
 [-b-] {+B+}

wdiffmungkin juga membaca diffdata terpadu jika Anda memberikannya -datau --diff-inputopsi, misalnya dari git:

git diff somefile | wdiff -d -3

Meskipun wdiffbukan alat POSIX, itu umumnya tersedia.


Mungkin perlu dicatat bahwa jika terminal Anda mendukung pelarian ANSI, Anda dapat membuat wdiff mencetak keluaran berwarna mewah yang (imo) lebih mudah dibaca dengan ini di bashrc Anda: alias wdiff="wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m'"(diambil dari sini ).
scohe001
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.