diff onde as linhas são basicamente as mesmas, mas fora de ordem?

23

Eu quero diferenciar dois conjuntos de regras mod_rewrite. O conjunto de linhas é aproximadamente 90% idêntico, mas a ordem é tão diferente que o diff basicamente diz que são completamente diferentes.

Como posso ver quais linhas são realmente diferentes entre dois arquivos, independentemente do número da linha?

user394
fonte
3
Passe os dois pelo sortpunho.
Shawn J. Goff
@ Shawn Posso fazer isso sem criar (e excluir depois) dois arquivos únicos?
user394

Respostas:

36

sortpode ser usado para obter os arquivos na mesma ordem, para diffcompará-los e identificar as diferenças. Se você tiver substituição de processo, poderá usá-lo e evitar a criação de novos arquivos classificados.

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

Criou um script para isso que mantém intacta a sequência de linhas . Aqui está uma versão anotada das linhas 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
fonte