जहां रेखाएं अधिकतर समान होती हैं लेकिन क्रम से बाहर होती हैं?


23

मैं mod_rewrite नियमों के दो सेटों को अलग करना चाहता हूं। लाइनों का सेट लगभग 90% समान है, लेकिन क्रम इतना अलग है कि मूल रूप से अलग-अलग कहते हैं कि वे पूरी तरह से अलग हैं।

मैं कैसे देख सकता हूँ कि दो लाइन के बीच कौन-सी लाइनें अलग-अलग हैं, उनकी लाइन नंबर की परवाह किए बिना?


3
उन दोनों को sortमुट्ठी से गुजारें ।
शॉन जे। गोफ

@ शॉन क्या मैं दो वन-ऑफ फ़ाइलों को बनाने (और बाद में हटाने) के बिना कर सकता हूं?
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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.