diff donde las líneas son en su mayoría iguales pero fuera de orden?

23

Quiero diferenciar dos conjuntos de reglas mod_rewrite. El conjunto de líneas es aproximadamente 90% idéntico, pero el orden es tan diferente que diff básicamente dice que son completamente diferentes.

¿Cómo puedo ver qué líneas son realmente diferentes entre dos archivos, independientemente de su número de línea?

usuario394
fuente
3
Pasarlos a ambos a través del sortpuño.
Shawn J. Goff
@ Shawn ¿Puedo hacer esto sin crear (y eliminar después) dos archivos únicos?
usuario394

Respuestas:

36

sortpuede usarse para colocar los archivos en el mismo orden, de modo que diffpueda compararlos e identificar las diferencias. Si tiene sustitución de proceso, puede usar eso y evitar crear nuevos archivos ordenados.

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

Hizo un guión para esto que mantiene la secuencia de línea intacta . Aquí hay una versión anotada de las líneas 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
fuente