diff wo sind die linien meist gleich aber ausser ordnung?

23

Ich möchte zwei Sätze von mod_rewrite-Regeln unterscheiden. Die Linien sind zu 90% identisch, aber die Reihenfolge ist so unterschiedlich, dass diff im Grunde sagt, dass sie völlig unterschiedlich sind.

Wie kann ich erkennen, welche Zeilen zwischen zwei Dateien wirklich unterschiedlich sind, unabhängig von ihrer Zeilennummer?

user394
quelle
3
Führen Sie beide durch sortFaust.
Shawn J. Goff
@Shawn Kann ich dies tun, ohne zwei einmalige Dateien zu erstellen (und anschließend zu löschen)?
User394

Antworten:

36

sortkann verwendet werden, um die Dateien in die gleiche Reihenfolge zu bringen, diffum sie zu vergleichen und die Unterschiede zu identifizieren. Wenn Sie eine Prozessersetzung haben, können Sie diese verwenden und das Erstellen neuer sortierter Dateien vermeiden.

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

Hierfür wurde ein Skript erstellt , das die Zeilenfolge intakt hält . Hier ist eine kommentierte Version der wichtigen Zeilen:

# 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
quelle