2010-12-13 3 views
26

diff имеет опцию -I regexp, которая игнорирует изменения, которые просто вставляют или удаляют строки, соответствующие заданному регулярному выражению. Мне нужен аналог этого для случая, когда изменения между двумя строками (а не вставкой или удалением строк).Как игнорировать некоторые отличия в команде diff?

Например, я хочу, чтобы игнорировать все различия, как между "abXd" и "abYd", для данного X и Y.

Кажется diff не имеет такой возможности. Есть ли подходящая альтернатива для diff?

ответ

18

Вы можете отфильтровать два файла через sed, чтобы устранить линии, которые вам не нужны. Общий шаблон равен /regex1/,/regex2/ d, чтобы удалить что-либо между строками, соответствующими двум регулярным выражениям. Например:

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

Спасибо за ответ. 'sed '/ regex/d' file' удаляет все строки в' файле', где встречается совпадение 'regex'. Есть ли способ удалить не строку, а только соответствующую ее часть? – Vahagn

+0

Я не уверен, что вы хотите сделать. Можете ли вы изменить свой вопрос на примере двух файлов, которые вы хотите разделить, и чего вы хотите получить? –

+0

К сожалению, это не будет работать с рекурсивным ('-r') diff по понятным причинам. –

0

Предполагая, что X и Y являются одиночными символами, тогда -I 'ab[XY]d' отлично работает для меня.

+0

И для меня тоже. – user2023370

+6

Это полностью игнорирует линию. Если в этой строке есть другие отличия, это скроет их. – CoatedMoose

18

Улучшение на earlier solution Джон Kugelman:

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

, вероятно, что вы можете искать! Эта версия нормализует конкретные изменения на каждой строке без удаления самой строки. Это позволяет diff показать любые другие отличия, которые остаются на линии.

1

Вы можете использовать СЭД для замены экземпляров шаблона со стандартной строкой:

diff <(sed 's/ab[XY]d/ab__REPLACED__d/g' file1) <(sed 's/ab[XY]d/ab__REPLACED__d/g' file2) 
Смежные вопросы