8

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

Однако это оказывается сложнее, чем можно подумать, потому что инструмент выводит строки, в которых порядок не имеет значения (например, операторы import , объявления функций и т.д.), В полуслучайном порядке. Из-за этого выходные данные diff загромождены множеством изменений, которые на самом деле представляют собой только строки, перемещенные в другую позицию в том же файле.

Есть ли способ заставить diff игнорировать эти шаги и выводить только те строки, которые действительно были добавлены или удалены?

4 ответа4

3

Вы можете попытаться отсортировать их в первую очередь. Что-то вроде:

sort file-a > s-file-a
sort file-b > s-file-b
diff s-file-a s-file-b

Bash (и zsh) могут сделать это в одной строке с подстановкой процесса

diff <(sort file-a) <(sort file-b)
2

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

Это породило отдельный проект для рабочего кода. Код.

0

Похоже, у вас есть контроль над инструментом. Затем сделайте его вывод предсказуемым: вместо генерации объявлений в полуслучайном порядке используйте (скажем) алфавитный порядок в качестве последнего средства. Это позволит не только удалить бесполезные помехи из различий, но и упростить чтение и проверку выходных данных инструмента для человека.

0

Если файл структурирован по разделам, это просто разделы, которые не в порядке, и существует регулярное выражение, которое вы можете использовать для распознавания заголовка раздела, вы можете разбить файлы на их разделы и затем сравнить пары попарно.

Например, я просто сделал это на двух дампах MySQL, чтобы сравнить их после того, как некоторые имена баз данных изменили регистр (и, следовательно, дамп перечислил их в другом порядке):

csplit all-07sep2015-11:19:12.sql '/Current Database/-1' '{*}'  # split the dump made before the change, creating files xx00, xx01, ...
csplit -f yy all-07sep2015-12:26:12.sql '/Current Database/-1' '{*}' # split the dump made after the change, creating files yy00, yy01, ...
fgrep 'Current Database' xx?? yy?? | perl -lne 'BEGIN{my %foo}; /(^....).*`(.*)`/ and push(@{$foo{lc($2)}}, $1); END {printf("diff -di %s %s\n", @{$_}) for values %foo}' | sh -x | less  # match the pairs and compare them with diff

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .