Получить номера строк различий в двух файлах при выполнении сравнения двух файлов в Windows - PullRequest
4 голосов
/ 10 ноября 2010

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

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

Есть ли способ получить только номера строк измененного файла? Типы файлов - это исходные текстовые файлы, такие как Javascript, Java, XML, XSL и т. Д.

Файлы примеров -

foo (новая версия):

a
b
c
d
e
f
g
h
i
j
k

foo (старая версия):

a
b
C
d
h
i
k

Вывод, который я ищу:

foo: 3, 5-7, 10-11

OR

foo:
3
5-7
10-11

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

EDIT: GNU DiffUtils близок к тому, что я хочу, но не совсем соответствует моим потребностям. Глядя на параметры командной строки, я вижу «-q» (или «--brief») как упрощенный diff, но он СЛИШКОМ прост. Выход:

C:\Program Files\GnuWin32\bin>diff.exe -q foo1.txt foo2.txt
Files foo1.txt and foo2.txt differ

Нормальный разностный выход:

C:\Program Files\GnuWin32\bin>diff.exe foo1.txt foo2.txt
3c3
<     c
---
>     C
5,7d4
<     e
<     f
<     g
10,11c7
<     j
<     k
---
>     k
\ No newline at end of file

diff -u вывод:

C:\Program Files\GnuWin32\bin>diff.exe -u foo1.txt foo2.txt
--- foo1.txt    2010-11-09 15:47:12.447916000 -0600
+++ foo2.txt    2010-11-09 15:47:36.129954700 -0600
@@ -1,11 +1,7 @@
     a
     b
-    c
+    C
     d
-    e
-    f
-    g
     h
     i
-    j
-    k
+    k
\ No newline at end of file

Я ищу что-то более информативное, чем diff -q, но менее информативное, чем diff -u и diff. Есть ли разные ниндзя, которые знают о различных вариантах, позволяющих это сделать?

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

Ответы [ 4 ]

3 голосов
/ 10 ноября 2010

GNU DiffUtils является открытым исходным кодом, бесплатен и имеет порт Windows .

2 голосов
/ 22 января 2014

Сохранить первый файл как x.txt, а второй как y.txt

Затем запустите:

diff -i --unchanged-line-format = "¥" --new-line-format = ":% dn:% L" y.txt x.txt |perl -pe 's / ¥ / \ n / g' |perl -pe '$ count ++;if ($ _! ~ / ^ \ n $ /) {print "$ count \ t";} '

1 голос
/ 10 ноября 2010

Windows родная. Наш SD Smart Differencer создает дельты не по строкам, а по программным структурам и точен в отношении строки / столбца-строки / столбца и типа редактируемого объекта программы. Он сравнивает, анализируя исходный текст и используя структуру кода для сравнения. Дельты описываются с точки зрения действий, представляющих интерес для программистов: вставка, замена, удаление, замена.

Вот пример:

Java~Java1_5 SmartDifferencer Version 1.1.1
Copyright (C) 2009 Semantic Designs, Inc; All Rights Reserved; SD Confidential
Powered by DMS (R) Software Reengineering Toolkit
*** Parsing file C:/DMS/Domains/Java/Java1_5/Analyzers/SmartDifferencer/Tests/diff1_before.java ...
*** Parsing file C:/DMS/Domains/Java/Java1_5/Analyzers/SmartDifferencer/Tests/diff1_after.java ...
*** Creating suffix tree ...
*** Determining maximal pairs ...
*** Sorting maximal pairs ...
*** Determining differences ...
*** Printing edits ...
a12.5 I s12.5-12.57:field_declaration
a179.9 I s185.9-185.71:executable_statement
a193.5 I s201.9-203.9:executable_statement
a272.13 I t279.13-280.33f267.13-268.30[267.17'lineNum'~>279.17'endLineNum',268.17'columnNum'~>280.17'endColumnNum']:statement_sequence_member,statement_sequence_member
a340.68 I s352.68-352.68:',' s352.70-352.70:INTEGER s352.71-352.71:',' s352.73-352.73:INTEGER
a423.13 I t436.13-509.38f450.17-518.35[482.17'hlevel'~>468.13'endLineNum',518.17'hname'~>509.13'endColumnNum']:executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement
a423.84 I s513.84-513.84:',' s513.86-513.95:IDENTIFIER s513.96-513.96:',' s513.98-513.109:IDENTIFIER
s424.13-424.59:expression_statement S s514.25-514.47:expression_statement
s429.13-429.64:local_variable_declaration S s515.25-515.87:local_variable_declaration
s430.13-430.71:executable_statement f431.13-431.69[431.13'lineString'~>79.9'config',431.26'lineString'~>79.18'config',431.47'indexOfSpace'~>79.35'end_index']t79.9-79.56:executable_statement s432.13-432.51:executable_statement D a516.25
a433.13 I s516.25-519.25:executable_statement n433.13-439.13:executable_statement s433.13-433.14:'if' s433.16-433.16:'(' s433.17-433.30:relational_expression s433.31-433.31:')' s433.33-433.45:executable_statement s434.13-434.16:'else' n434.18-439.13:block s434.18-434.18:'{' n435.17-438.49:statement_sequence f435.17-435.71[435.17'lineString'~>79.9'config',435.28'lineString'~>79.18'config',435.49'indexOfSpace'~>79.35'end_index']t79.9-79.56:executable_statement s436.17-436.28:executable_statement s437.17-437.51:executable_statement s438.17-438.49:executable_statement s439.13-439.13:'}' D a516.25
a442.13 I s520.25-520.54:executable_statement

Действиями редактирования верхнего уровня являются «I», «S», «R» и «D», с подробной информацией о том, что было добавлено, вставлено или удалено с левой или правой стороны I / S / R / D. символ с точностью до line.column. Например, в строке 5 столбца 12 было объявлено поле «I», просто в строке 12 от столбца 5 до столбца 57. В строке 272 блок кода был «I» вставлен из строк 279-280 с идентификатор lineNum заменен на endLineNum. В строке 424 во втором файле выражение выражения было заменено на "S" одним из строки 514. Подробнее на веб-сайте.

Вы можете легко удалить дополнительные детали (например, после символов ":" и внутри []), если хотите что-то вроде Perl.

1 голос
/ 10 ноября 2010

Не знаю о родном методе Windows, но для этого я использую функцию сравнения файлов в Textpad, и она довольно хороша.

...