2010-12-13 21 views
26

diff có tùy chọn -I regexp, bỏ qua những thay đổi chỉ chèn hoặc xóa các dòng khớp với regexp đã cho. Tôi cần một tương tự về điều này cho trường hợp, khi thay đổi là giữa hai dòng (thay vì sau đó chèn hoặc xóa các dòng). Ví dụ:Làm thế nào để bỏ qua một số khác biệt trong lệnh diff?

Ví dụ: tôi muốn bỏ qua tất cả các khác biệt như giữa "abXd""abYd", cho số XY nhất định.

Có vẻ như diff không có khả năng như vậy. Có bất kỳ giải pháp thay thế phù hợp nào cho diff không?

Trả lời

18

Bạn có thể lọc hai tệp qua sed để loại bỏ các dòng bạn không quan tâm. Mẫu chung là /regex1/,/regex2/ d để xóa mọi thứ giữa các dòng khớp với hai regex. Ví dụ:

diff <(sed '/abXd/,/abYd/d' file1) <(sed '/abXd/,/abYd/d' file2) 
+1

Cảm ơn câu trả lời. 'sed '/ regex/d' file' xóa tất cả các dòng trong' file' trong đó một sự khớp 'regex' xảy ra. Có cách nào để xóa không phải là dòng nhưng chỉ là một phần phù hợp của nó? – Vahagn

+0

Tôi không chắc chắn chính xác những gì bạn muốn làm. Bạn có thể chỉnh sửa câu hỏi của mình bằng một ví dụ về hai tệp bạn muốn phân biệt và bạn muốn kết quả là gì không? –

+0

Thật không may, điều này sẽ không làm việc với khác nhau đệ quy ('-r') vì lý do rõ ràng. –

0

Giả sử X và Y là các ký tự đơn, sau đó -I 'ab[XY]d' hoạt động tốt cho tôi.

+0

Và đối với tôi quá. – user2023370

+6

Điều này hoàn toàn bỏ qua dòng. Nếu có sự khác biệt khác trong dòng mà bạn quan tâm, điều này sẽ ẩn chúng. – CoatedMoose

18

Việc cải thiện các earlier solution bởi John Kugelman:

diff <(sed 's/ab[XY]d/abd/g' file1) <(sed 's/ab[XY]d/abd/g' file2) 

có lẽ là những gì bạn có thể tìm kiếm! Phiên bản này bình thường hóa thay đổi cụ thể trên mỗi dòng mà không xóa chính dòng đó. Điều này cho phép khác hiển thị bất kỳ khác khác biệt nào vẫn còn trên đường.

1

Bạn có thể sử dụng sed để thay thế trường hợp của mô hình với một chuỗi tiêu chuẩn:

diff <(sed 's/ab[XY]d/ab__REPLACED__d/g' file1) <(sed 's/ab[XY]d/ab__REPLACED__d/g' file2) 
Các vấn đề liên quan