diff-игнорирование diff / diff через несколько строк / reflow-игнорирование diff
Кто-нибудь знает инструмент, похожий на diff, который может показать мне изменения между двумя текстовыми файлами, но игнорировать изменения в пробелах, включая переводы строки?
Вот пример:
быстрая коричневая лиса перепрыгнула через ленивого медведя. быстрая коричневая лиса перепрыгнул через ленивого медведя. быстрая коричневая лиса перепрыгнула через ленивого нести. быстрая коричневая лиса перепрыгнула через ленивого медведя.
быстрая коричневая лиса перепрыгнула через ленивого медведя. быстрый бурый лис прыгнул над ленивым медведем. быстрая коричневая лиса перепрыгнула через ленивого медведя. быстрая коричневая лиса перепрыгнула через ленивого медведя.
Все, что я сделал, это удалил одно слово и перекомпоновал его, но "diff -b" обнаруживает изменения в каждой строке (как и должно быть; я не говорю, что это ошибка в diff). Но для больших файлов LaTeX это большая проблема; измените одно слово в длинном абзаце, и разница, которую вы получите, в принципе бесполезна.
Между прочим, я знаю, что это требует гораздо большей вычислительной мощности, чем обычный diff-файл. Я делаю это только с небольшими файлами, созданными человеком, и с удовольствием буду ждать долго, если придется.
2 ответа
wdiff выполняет пословное выравнивание.
Для удобного чтения в терминале запустите
wdiff -al <file1> <file2> | less
Это покажет (по крайней мере, в моей системе) вставки в <file2>
жирным шрифтом и удаления из <file2>
подчеркнуты.
Один из вариантов - сделать это, разбив весь файл на слова. Не на 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
по результатам.