Как я могу различить два файла и сообщить о разделе, в котором встречаются различия? - PullRequest
2 голосов
/ 18 марта 2010

У меня есть два текстовых файла с несколькими разделами в них. У каждого раздела есть заголовок с именем раздела (grep может извлечь все имена разделов, не извлекая ничего из файла). Как я могу сообщить о различиях между этими двумя файлами И сообщить о разделе, в котором возникает разница? Я также должен быть в состоянии сообщить о добавленных / пропущенных разделах. В идеале идентичные разделы вообще не упоминаются в отчете.

Ответы [ 2 ]

2 голосов
/ 18 сентября 2011

Использовать diff s --show-function-line параметр:

diff -U 0 --show-function-line='^HEAD ' old-file new-file

Он не сообщит правильный раздел, если он появляется только в выходном файле (например, если вы добавили новый раздел в конец файла, добавленные строки будут отображаться как последний раздел старого файла ).

Следующий скрипт может помочь, хотя он далеко не однострочный. Будет напечатано:

  • разделы из старого файла с удаленными строками с префиксом " -"
  • разделы из нового файла со вставленными строками с префиксом " +"
  • удаленные строки (включая удаленные заголовки разделов) с префиксом "+"
  • вставленные строки (включая новые заголовки разделов) с префиксом "-"

Вот скрипт:

#!/bin/bash
# Usage : ./script old-file new-file
diff \
    --new-line-format='+%dn'$'\n' \
    --old-line-format='-%dn'$'\n' \
    --unchanged-line-format='' \
    $1 \
    $2 \
    | \
(
    lnumOld=0;
    lnumNew=0;
    header='NO HEADER'
    printheader=1
    while read lprint; do
        if [ "$((lprint))" -gt 0 ]; then
            sep='+'
            while [ $lnumNew -lt $lprint ]; do
                read line <&4
                if [ "${line#HEAD }" != "$line" ]; then
                    header="$sep$line"
                    printheader=1
                fi
                ((lnumNew++));
            done
        else
            sep='-'
            while [ $lnumOld -lt $((-1*$lprint)) ]; do
                read line <&3
                if [ "${line#HEAD }" != "$line" ]; then
                    header="$sep$line"
                    printheader=1
                fi
                ((lnumOld++));
            done
        fi
        if [ $printheader = 1 ]; then
            echo " $header"
            printheader=0
        fi
        echo "$sep$line";
    done) 3<"$1" 4<"$2"
1 голос
/ 20 марта 2010

Если вы введете искусственное изменение в заголовках, это заставит их появляться в diff. Не совсем то, что вы хотите, но, возможно, это даст вам представление.

Предполагая, что ваше регулярное выражение для поиска заголовков равно ^HEAD:

sed -e 's/^HEAD/>HEAD/' file1.txt | diff -u - file2.txt

Редактировать : Если вы хотите, чтобы результирующий дифференциал был реальным, вы можете использовать sed для удаления различий HEAD.

sed -e 's/^HEAD/>HEAD/' file1.txt | diff -u - file2.txt | sed -e 's/^->HEAD/ HEAD/; /^+HEAD/D'
...