Diff + patch - сумма вместо замены - PullRequest
1 голос
/ 20 июня 2011

Скажем, у меня есть файл A, который содержит это:

a = 5

И файл B, вот так:

b = 5

Теперь очевидно, что diff выдаст что-то вроде этого (патч):

1c1

<</em> a = 5

---

> b = 5

Исправление файла A, очевидно, заменит его содержимое на содержимое файла B, в результате чего файл A будет содержать

b = 5

То, что я хочу сделать, однако, отличается. Я хочу, чтобы содержимое файлов A и B слилось, чтобы после исправления файла A оно содержало

a = 5

b = 5

Мой случай, конечно, намного сложнее, чем мой пример, но я думаю, что я понял это за исключением суммирования diff / patch в конце.

tl; dr: я хочу чтобы diff / patch суммировал, а не заменял различия в файлах. Как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 20 июня 2011

Вы не хотите исправлять некоторые файлы, вы пытаетесь объединить их. Есть много инструментов, которые помогут вам, например, взгляните на kdiff!

Редактировать : Еще несколько инструментов:

  • MELD
  • gPyFm
  • diff3
  • tkdiff
  • P4Merge

По крайней мере vim -d выполнит работу; -)

0 голосов
/ 20 июня 2011

Команда diff из пакетов diffutils GNU позволяет объединить два разных файла, вставив инструкции препроцессора #ifdef. Например, рассмотрим 2 файла f1 и f2 (отображаются рядом):

line 1     |   line 1
line 2     |   line 2
line 3a    |   line 3a
line 4     |   line 4
line 5a    |   line 5a

При вызове diff -D MARKER f1 f2 будет получен этот объединенный вывод:

line 1
line 2
#ifndef MARKER
line 3a
#else /* MARKER */
line 3b
#endif /* MARKER */
line 4
#ifndef MARKER
line 5a
#else /* MARKER */
line 5c
#endif /* MARKER */

Вы можете удалить инструкции препроцессора, чтобы получить чистый объединенный файл, например, используя grep:

diff -D MARKER f1 f2 | grep -v "MARKER"

Обратите внимание, что токен MARKER не должен существовать в исходных входных файлах, поэтому лучше использовать что-то более особенное, например, случайный токен типа c11ced4751ef4b3aa60e512bdaa184210441b4ed0.

0 голосов
/ 20 июня 2011

Вы очень мало рассказываете о том, какую проблему вы пытаетесь решить (или слишком много говорите о том, что выбранный вами подход не сработал).Что еще интереснее, так это то, что вы хотите сделать.

Возможно, вы могли бы покончить с

sort -u A B

, потому что он даст желаемый результат с предоставленными вами входами.

...