diff行はほとんど同じですが、順序が狂っていますか?


23

mod_rewriteルールの2つのセットを比較します。行のセットは約90%同一ですが、順序は非常に異なるため、diffは基本的に完全に異なると言います。

行番号に関係なく、2つのファイル間でどの行が本当に異なるかをどのように確認できますか?


3
両方ともsort拳に通します。
ショーンJ.ゴフ

@Shawn 2つの一時ファイルを作成(および削除)せずにこれを実行できますか?
ユーザー394

回答:


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.