diff dove le linee sono per lo più uguali ma fuori servizio?


23

Voglio diffondere due serie di regole mod_rewrite. L'insieme di linee è identico al 90% circa, ma l'ordine è così diverso che diff dice sostanzialmente che sono completamente diverse.

Come posso vedere quali righe sono veramente diverse tra due file, indipendentemente dal loro numero di riga?


3
Passali entrambi a sortpugno.
Shawn J. Goff,

@Shawn Posso farlo senza creare (ed eliminare in seguito) due file una tantum?
user394,

Risposte:


36

sortpuò essere utilizzato per ottenere i file nello stesso ordine in modo da diffpoterli confrontare e identificare le differenze. Se si dispone della sostituzione del processo, è possibile utilizzarlo ed evitare di creare nuovi file ordinati.

diff <(sort file1) <(sort file2)

8

Realizzato uno script per questo che mantiene intatta la sequenza di linee . Ecco una versione annotata delle righe importanti:

# Strip all context lines
diff_lines="$(grep '^[><+-] ' | sed 's/^+/>/;s/^-/</')" || exit 0

# For each line, count the number of lines with the same content in the
# "left" and "right" diffs. If the numbers are not the same, then the line
# was either not moved or it's not obvious where it was moved, so the line
# is printed.
while IFS= read -r line
do
    contents="${line:2}"
    count_removes="$(grep -cFxe "< $contents" <<< "$diff_lines" || true)"
    count_adds="$(grep -cFxe "> $contents" <<< "$diff_lines" || true)"
    if [[ "$count_removes" -eq "$count_adds" ]]
    then
        # Line has been moved; skip it.
        continue
    fi

    echo "$line"
done <<< "$diff_lines"

if [ "${line+defined}" = defined ]
then
    printf "$line"
fi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.