2セットのmod_rewriteルールを比較したい。行のセットは約90%同一ですが、順序が非常に異なるため、diffは基本的にそれらは完全に異なると言います。
行番号に関係なく、2つのファイル間でどの行が本当に異なるかを確認するにはどうすればよいですか?
sort
を使用すると、ファイルを同じ順序に並べ替えることができるため、diff
はファイルを比較して違いを識別できます。プロセス置換がある場合は、それを使用して、ソートされた新しいファイルの作成を回避できます。
diff <(sort file1) <(sort file2)
このために script を作成しましたこれは、行シーケンスをそのまま保持します。重要な行の注釈付きバージョンは次のとおりです。
# 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