Использование diff для длинного однострочного файла

Использование diff для длинного однострочного файла

У меня есть файл, в котором всего одна строка. Его размер около 20 000 байт.

Файл был изменен, и я хотел бы узнать, где именно.

Я думал использовать diff, но он показывает мне полную строку, потому что выводит строку, в которой есть различия, но в этом случае это единственная строка в файле, в которой есть различия.

Вот я и хотел посмотреть, в чем разница.

Любой совет?

решение1

Предполагая, что в файле много пробелов, как в обычном тексте, вы можете разбить файл по словам и сравнить их с помощью обычного инструмента сравнения, например, meld:

tr -s ' ' '\n' < file1.txt > file1.txt.split
tr -s ' ' '\n' < file2.txt > file2.txt.split
meld file1.txt.split file2.txt.split

решение2

Я бы нашел diff, который делает внутристрочные diff. Я используюxxdiffна UNIX. Я думаюWinMergeвыполняет ли внутристрочное различие в Windows.

Другие ответы тоже хороши: wdiff или разбиение на фрагменты — границы фрагментов легче определить, если данные разделены, скажем, вертикальной чертой или запятой.

решение3

Если это разовая проблема, я бы создал копии файлов со \nвставленными через каждые 50 символов символами, а затем сравнил бы эти копии. (Я выбрал 50, потому что это упрощает математику, переходя от отличающегося номера строки к смещению байтов в исходных файлах, но могу скорректировать это в зависимости от того, что я обнаружу.)

решение4

Я нашел git diffэту --word-diff=porcelainопцию полезной для такой задачи, например, если у вас есть 2 файла с длинными строками, которые отличаются только 1 символом, вывод можно направить через , grepчтобы отфильтровать измененные строки и изменения, а затем grepеще раз через , чтобы отобразить только последние 80 символов каждой строки:

echo {1..4000} A {4001..8000} > a.tmp
echo {1..4000} B {4001..8000} > b.tmp

> git diff -U0 --word-diff=porcelain a.tmp b.tmp | grep -A3 '@@' | egrep -o '.{1,80}$'
@@ -1 +1 @@
3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000
-A
+B

Связанный контент