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.

anol
sumber
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
terkait: unix.stackexchange.com/questions/11128/diff-within-a-line
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

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.

Kusalananda
sumber
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