Разница где линии в основном одинаковы, но не в порядке?

23

Я хочу показать два набора правил mod_rewrite. Набор линий примерно на 90% идентичен, но порядок настолько различен, что diff в основном говорит, что они совершенно разные.

Как я могу увидеть, какие строки действительно отличаются между двумя файлами, независимо от их номера строки?

user394
источник
3
Пропустите их через sortкулак.
Шон Дж. Гофф
@Shawn Могу ли я сделать это без создания (и последующего удаления) двух одноразовых файлов?
user394

Ответы:

36

sortможет использоваться для приведения файлов в один и тот же порядок, поэтому diffможно сравнивать их и выявлять различия. Если у вас есть процесс подстановки, вы можете использовать его и избегать создания новых отсортированных файлов.

diff <(sort file1) <(sort file2)
Шон Дж. Гофф
источник
8

Сделал для этого скрипт, который сохраняет последовательность строк нетронутой . Вот аннотированная версия важных строк:

# 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
источник