2010-04-09 18 views
14

Кто-нибудь знает о подобном инструменте, который может показать мне изменения между двумя текстовыми файлами, но игнорировать изменения в пробеле , включая новые строки?newline-ignoring diff/diff на нескольких линиях/reflow-ignoring 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. 

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

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

ответ

11

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

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

wdiff -al <file1> <file2> | less 

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

+0

ВНИМАНИЕ: wdiff не может быть доступен для каждой системы. Но это крутая утилита – DVK

+0

Ура! Это именно то, чего я хотел. Теперь я просто должен ждать переполнения стека, чтобы позволить мне объявить этот ответ. – Adam

+0

Хотя wdiff классный, я на самом деле делаю это по двум причинам: в первую очередь, wdiff не показывает номера строк найденных различий (огромные неудобства); и во-вторых, потому что он ориентирован на слова, он не может игнорировать изменения в пробеле (т. е. 'foreach (' vs 'foreach ('). Я написал скрипт PHP, чтобы компенсировать вторую проблему, но без номеров строк это огромный тратить время на поиск «интересных» различий. Я надеялся сказать что-то хорошее о сравнении ++, но мне еще нужно услышать от них, что у них есть .rpm – Jeff

1

Один из вариантов - сделать это, разделив весь файл на слова. Не 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 по результатам.