khác biệt chỉ hiển thị sự khác biệt bên trong dòng


9

Tôi muốn so sánh các dòng trong hai tệp, nhưng để giảm thiểu nhiễu ở đầu ra, tôi chỉ muốn sự khác biệt thực tế trong các dòng được in.

Chẳng hạn, đưa ra hai tệp dưới đây:

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

(sự khác biệt giữa chúng là trường hợp của chữ cái b)

Tôi muốn đầu ra giống như:

[-b-]{+B+}

Hiện tại, cách tiếp cận tốt nhất tôi tìm thấy là sử dụng git diff --word-diff, nhưng nó cho ra toàn bộ dòng:

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

Có cách nào trực tiếp hơn để làm điều đó, ngoài việc phân tích cú pháp đầu ra bằng tay không? Ngoài ra, lý tưởng nhất là tôi thích sử dụng thứ gì đó phổ biến hơn git diff, ví dụ như công cụ shell POSIX không yêu cầu người dùng cài đặt các gói bổ sung.


Sẽ thật tuyệt nếu bạn sử dụng một ví dụ mà sự khác biệt được nhìn thấy rõ hơn. Tôi phải nheo mắt để thấy hai nhân vật đó không giống nhau.
Barmar

Xin lỗi, tôi đã thêm một ghi chú mô tả sự khác biệt giữa các dòng.
anol

Tại sao không chỉ sử dụng bBvì vậy nó rõ ràng? Tôi hiểu rằng đây có lẽ là sự khác biệt thực sự, nhưng với mục đích của câu hỏi, bạn có thể làm cho nó dễ dàng hơn.
Barmar

1
Tôi muốn tránh các giải pháp chỉ hoạt động trên các ký tự ASCII, nhưng vì giải pháp được đề xuất không phụ thuộc vào nó, tôi đã thay đổi nó. Tuy nhiên, tôi không thể cập nhật câu trả lời để phản ánh những thay đổi mới vì bản chỉnh sửa sẽ nhỏ hơn 6 ký tự.
anol

Câu trả lời:


14

Sử dụng wdiff :

$ wdiff -3 a.txt b.txt

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

Các -3hoặc ---no-commontùy chọn sẽ loại bỏ những từ mà rất phổ biến giữa hai tập tin và chỉ hiển thị sự khác biệt.

Các ===...biểu ngữ (và dòng trống) có thể được loại bỏ bằng grep:

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

wdiffcũng có thể đọc diffdữ liệu hợp nhất nếu bạn cung cấp cho nó tùy chọn -dhoặc --diff-input, ví dụ từ git:

git diff somefile | wdiff -d -3

Mặc dù wdiffkhông phải là một công cụ POSIX, nhưng nó thường có sẵn.


Có thể đáng lưu ý rằng nếu thiết bị đầu cuối của bạn hỗ trợ thoát ANSI, bạn có thể làm cho đầu ra in màu lạ mắt dễ đọc hơn (imo) với điều này trong bashrc của bạn: alias wdiff="wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m'"(lấy từ đây ).
scohe001
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.