игнорирование новой строки diff / diff по нескольким строкам / diff игнорирование reflow - PullRequest
15 голосов
/ 09 апреля 2010

Кто-нибудь знает инструмент, похожий на diff, который может отображать изменения между двумя текстовыми файлами, но игнорировать изменения в пробелах , включая переводы строк ?

Вот пример:

the quick brown fox jumped over the lazy bear.  the quick brown fox
jumped over the lazy bear.  the quick brown fox jumped over the lazy
bear.  the quick brown fox jumped over the lazy bear.
quick brown fox jumped over the lazy bear.  the quick brown fox jumped
over the lazy bear.  the quick brown fox jumped over the lazy bear.
the quick brown fox jumped over the lazy bear.

Все, что я сделал, это удалил одно слово и перекомпоновал его, но «diff -b» обнаруживает изменения в каждой строке (как и должно быть; я не говорю, что это ошибка в diff). Но для больших файлов LaTeX это большая проблема; измените одно слово в длинном абзаце, и разница, которую вы получите, в принципе бесполезна.

Между прочим, я знаю, что это требует гораздо большей вычислительной мощности, чем обычные линии с атомной разницей. Я делаю это только с небольшими файлами, созданными человеком, и с удовольствием буду ждать долго, если придется.

Ответы [ 2 ]

12 голосов
/ 09 апреля 2010

wdiff выполняет пословное выравнивание.

Для удобного чтения в терминале, запустите

 wdiff -al <file1> <file2> | less

Это покажет (по крайней мере, в моей системе) вставки в <file2> жирным шрифтом и удаления из <file2> подчеркнуты.

1 голос
/ 09 апреля 2010

Один из вариантов - сделать это, разбив весь файл на слова. Не на 100% тот же самый результат в терминах знания контекста, но очень точно настроен на тип изменений, которые вас интересуют.

Пример:

cat file1 | perl5.8 -e '{s/\s+/\n/g;}' > file1.split_words
cat file2 | perl5.8 -e '{s/\s+/\n/g;}' > file2.split_words
diff file1.split_words file2.split_words

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

...