LINUX.ORG.RU

вопрос по diff


0

0

Есть документ doc.prev:
....
BLOCK 1 BEGIN
.....
BLOCK 1 END
.....
BLOCK 2 BEGIN
.....
BLOCK 2 END
.....
вложенных блоков нет
строки вида BLOCK X BEGIN/END уникальны во всём документе

в документ вносят изменения между строк BLOCK 1 BEGIN/END и обзывают doc.now:
.....
BLOCK 1 BEGIN
changed
BLOCK 1 END
......

далее делают:
diff -????? doc.prev doc.now > patch1 - в ключах и есть вопрос
документ doc.now стирают

Далее в документ doc.prev вносят ещё много изменений , НО не между строк
BLOCK 1 BEGIN
BLOCK 1 END

изменения могут быть как малыми так и меняющие всё кроме того что находится между BLOCK 1 BEGIN/END

Через какое-то время возникает необходимость сделать:
patch doc.prev < patch1
После этого надо в doc.prev получить:
......
какие-то данные
BLOCK 1 BEGIN
changed
BLOCK 1 END
ещё какие-то данные
....

Вопрос:
Какие ключи надо задать diff, чтобы получить патч, однозначно опирающийся только на строки BLOCK 1 BEGIN; BLOCK 1 END


Как то ты совсем сложно вещаешь.

Попробуй diff -urpN file.old file.new, обычно ничего больше и не надо.

Valmont ★★★
()
Ответ на: комментарий от Valmont

Пример того, что я хочу:
файл doc.prev:

BLOCK 1 BEGIN
It is block 1 data
BLOCK 1 END

some data

BLOCK 2 BEGIN
It is block 2 data
BLOCK 2 END

some data
some data
some data
some data

BLOCK 3 BEGIN
It is block 3 data
BLOCK 3 END

xxxsssdddf

Копирую этот файл в файл doc.now
И в файл doc.now вношу изменения, после которых файл doc.now выглядит так:

BLOCK 1 BEGIN
It is block 1 data
BLOCK 1 END

some data

BLOCK 2 BEGIN
It is block 2 data
DATA in this block was changed
BLOCK 2 END

some data
some data
some data
some data

BLOCK 3 BEGIN
It is block 3 data
BLOCK 3 END

xxxsssdddf

Получаю патч:
diff -upN doc.prev doc.now > patch1
Патч выглядит так:

--- doc.prev 2006-06-26 21:26:16.000000000 +0400
+++ doc.now 2006-06-26 21:35:23.000000000 +0400
@@ -6,6 +6,7 @@ some data

BLOCK 2 BEGIN
It is block 2 data
+ DATA in this block was changed
BLOCK 2 END

some data

файл doc.now стираю за ненадобностью.
Вновь редактирую файл doc.prev. После редактирования он выглядит так:

BLOCK 2 BEGIN
It is block 2 data
BLOCK 2 END

Далее пытаюсь применить к нему патч
patch doc.prev < patch1
Получаю:
Hunk #1 FAILED at 6.
1 out of 1 hunk FAILED -- saving rejects to file doc.prev.rej

Файл doc.prev.rej содержит:
***************
*** 6,11 ****

BLOCK 2 BEGIN
It is block 2 data
BLOCK 2 END

some data
--- 6,12 ----

BLOCK 2 BEGIN
It is block 2 data
+ DATA in this block was changed
BLOCK 2 END

some data

Видимо patch не может опознать кусок, в который надо вносить изменения.
Можно ли как-то руками сказать программе diff, что кусок, в который вносятся изменения надо опознавать по строке До:
BLOCK 2 BEGIN
и строке После
BLOCK 2 END
и не по чему больше?

ksicom
() автор топика
Ответ на: комментарий от Valmont

вроде работает, если к блоку ещё пару строк приписать:
NEED BY DIFF
NEED BY DIFF
BLOCK 2 BEGIN
data
BLOCK 2 END
NEED BY DIFF
NEED BY DIFF

но как-то уродливо это выглядит
видимо придётся действительно скрипт писать...

ksicom
() автор топика
Ответ на: комментарий от ksicom

-U7d слегка подправит ситуацию (-U увеличит кол-во строк контекста в патче, -d заставит искать минимальные изменения)

хотя подход конечно крив :) можно поизголяться с заменой BEGIN/END на {} и опцией -p

кстати, а man`ов под рукой совсем нет ?

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

маны есть и даже прочтены :)
и даже попробовал уже всё сам :)
но вот только результаты не очень, потому и спрашиваю. Вдруг тайные тропы какие есть )))

ksicom
() автор топика
Ответ на: комментарий от ksicom

$ diff -C 1 doc.prev doc.now > patch $ cat patch *** doc.prev Mon Jul 10 20:59:42 2006 --- doc.now Mon Jul 10 20:59:56 2006 *************** *** 8,9 **** --- 8,10 ---- It is block 2 data + DATA in this block was changed BLOCK 2 END $ cat doc.prev BLOCK 2 BEGIN It is block 2 data BLOCK 2 END $ patch doc.prev <patch Hmm... Looks like a new-style context diff to me... The text leading up to this was: -------------------------- |*** doc.prev Mon Jul 10 20:59:42 2006 |--- doc.now Mon Jul 10 20:59:56 2006 -------------------------- Patching file doc.prev using Plan A... Hunk #1 succeeded at 2 (offset -6 lines). done $ cat doc.prev BLOCK 2 BEGIN It is block 2 data DATA in this block was changed BLOCK 2 END $ uname -a HP-UX XXXXXX B.11.11 U 9000/800 1535239988 unlimited-user license

anonymous
()
Ответ на: комментарий от anonymous

$ diff -C 1 doc.prev doc.now > patch
$ cat patch
*** doc.prev    Mon Jul 10 20:59:42 2006
--- doc.now     Mon Jul 10 20:59:56 2006
***************
*** 8,9 ****
--- 8,10 ----
  It is block 2 data
+ DATA in this block was changed
  BLOCK 2 END
$ cat doc.prev
BLOCK 2 BEGIN
It is block 2 data
BLOCK 2 END
$ patch doc.prev <patch
Hmm...  Looks like a new-style context diff to me...
The text leading up to this was:
--------------------------
|*** doc.prev   Mon Jul 10 20:59:42 2006
|--- doc.now    Mon Jul 10 20:59:56 2006
--------------------------
Patching file doc.prev using Plan A...
Hunk #1 succeeded at 2 (offset -6 lines).
done
$ cat doc.prev
BLOCK 2 BEGIN
It is block 2 data
DATA in this block was changed
BLOCK 2 END
$ uname -a
HP-UX XXXXXX B.11.11 U 9000/800 1535239988 unlimited-user license

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.