Как игнорировать некоторые различия в команде diff? - PullRequest
29 голосов
/ 14 декабря 2010

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

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

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

Ответы [ 4 ]

23 голосов
/ 14 декабря 2010

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

diff <(sed '/abXd/,/abYd/d' file1) <(sed '/abXd/,/abYd/d' file2)
19 голосов
/ 27 апреля 2012

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

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

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

1 голос
/ 21 февраля 2014

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

diff <(sed 's/ab[XY]d/ab__REPLACED__d/g' file1) <(sed 's/ab[XY]d/ab__REPLACED__d/g' file2)
1 голос
/ 14 декабря 2010

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

...