diff où les lignes sont généralement les mêmes mais hors service?

23

Je veux différencier deux ensembles de règles mod_rewrite. L'ensemble des lignes est identique à environ 90%, mais l'ordre est si différent que diff dit essentiellement qu'elles sont complètement différentes.

Comment puis-je voir quelles lignes sont vraiment différentes entre deux fichiers, quel que soit leur numéro de ligne?

user394
la source
3
Passez-les tous les deux au sortpoing.
Shawn J. Goff,
@Shawn Puis-je le faire sans créer (et supprimer par la suite) deux fichiers uniques?
user394

Réponses:

36

sortpeut être utilisé pour obtenir les fichiers dans le même ordre afin de diffpouvoir les comparer et identifier les différences. Si vous avez une substitution de processus, vous pouvez l'utiliser et éviter de créer de nouveaux fichiers triés.

diff <(sort file1) <(sort file2)
Shawn J. Goff
la source
8

A fait un script pour cela qui garde la séquence de lignes intacte . Voici une version annotée des lignes importantes:

# 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
l0b0
la source