как я могу различить два раздела одного и того же файла? - PullRequest
8 голосов
/ 12 января 2009

У меня есть исходный файл с двумя похожими, но слегка отличающимися друг от друга разделами. Я хотел бы объединить эти два раздела в одну подпрограмму с параметром, который обрабатывает тонкие различия, но я должен быть уверен, что знаю о них всех, чтобы не пропустить ни одного.
В таких случаях я обычно копирую каждый из разделов в отдельный файл, а затем использую tkdiff или vimdiff, чтобы выделить различия. Есть ли способ пропустить промежуточные файлы и просто различить две части одного и того же файла?

Ответы [ 7 ]

5 голосов
/ 10 декабря 2015

Плагин linediff для Vim хорошо работает для меня. Визуально выберите один раздел вашего файла и введите :Linediff. Визуально выберите другой раздел и введите :Linediff. Он переведет vim в режим vimdiff , показывая только те два раздела, которые вы выделили ранее. Введите :LinediffReset, чтобы выйти из режима vimdiff.

Дополнительная информация:

https://unix.stackexchange.com/a/52759/32477

https://superuser.com/a/414958/199800

5 голосов
/ 12 января 2009

KDiff3 является открытым исходным кодом и доступна на нескольких платформах, включая Win32 и Linux.

В нем есть функция «ручного выравнивания», обсуждавшаяся Гишу о Beyond Compare (которую, кстати, я не использовал лично, но многие люди, которых я знаю, считают отличным инструментом). *

manual alignment example См. этот ответ для дополнительных примеров.

4 голосов
/ 12 января 2009

Я использую Beyond Compare .
Это позволяет вам выбрать линию на каждой стороне и сказать «Выровнять вручную». Это должно хорошо работать для вас.

3 голосов
/ 12 января 2010

Я решил переработать ответ @ ordnungswidrig в функцию bash (меня интересовали только отличия от одного файла, но это можно было легко изменить для обработки двух разных файлов ...):

# find differences within a file giving start and end lines for both sections
function diff_sections {
  local fname=`basename $1`;
  local tempfile=`mktemp -t $fname`;
  head -$3 $1 | tail +$2 > $tempfile && head -$5 $1 | tail +$4 | diff -u $tempfile - ;
  rm $tempfile;
}

Вы вызываете функцию так ... diff_sections path/to/file 464 483 485 506

1 голос
/ 14 января 2009

Любой инструмент сравнения, который позволяет вам вручную настроить выравнивание, сделает эту работу. Диффузный (http://diffuse.sourceforge.net/) мой любимый, и он также позволяет вам вручную настроить выравнивание.

0 голосов
/ 07 февраля 2019

Emacs имеет ediff-region-wordwise для этого - вы можете взять два буфера (или только один) и выбрать регион в каждом, который затем будет отображен для сравнения.

0 голосов
/ 12 января 2009

Если вы можете описать начало и конец разделов для сравнения с регулярным выражением, вы можете использовать следующее:

sh -c 't=`mktemp`; cat "$0" | grep -e "$2" -A10000 | grep -e "$3" -B 10000 > $t; cat "$1" | grep -e "$2" -A10000 | grep -e "$3" -B 10000 | diff -u $t - ; rm $t' firstfile secondfile "section start" "section end"

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

sh -c 't=`mktemp`; cat "$0" | head -$3 |tail +$2 > $t; cat "$1" | head -$5 | tail +$4 | diff -u $t - ; rm $t' first second 4 10 2 8

4 10 2 8 - номер начальной и конечной строки для раздела, который необходимо рассмотреть из первого и второго файла.

Вы можете сохранять фрагменты скриптов оболочки или как псевдонимы.

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