Подтвердить что ты не робот

Как игнорировать некоторые различия в команде diff?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Улучшение более раннего решения от Джона Кугельмана:

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

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

Ответ 3

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

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

Ответ 4

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