diff, где строки в основном одни и те же, но не в порядке?

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

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

  • diff двух каталогов, но игнорировать расширения
  • Как подключить diff к Kompare?
  • Сравнить деревья каталогов относительно имени файла (и размера и даты)
  • Как сравнить два каталога полностью без git?
  • Храните патч в синхронизации с изменяющимся исходным кодом
  • Как «объединить» два текстовых файла?
  • Git pager меньше, но что вызывает окраску вывода?
  • Использование diff, но игнорирование чисел
  • 2 Solutions collect form web for “diff, где строки в основном одни и те же, но не в порядке?”

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

     diff <(sort file1) <(sort file2) 

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

     # 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 
    Linux и Unix - лучшая ОС в мире.