
У меня есть файл, в котором всего одна строка. Его размер около 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