2010-12-13 22 views
26

diff में एक विकल्प -I regexp है, जो उन परिवर्तनों को अनदेखा करता है जो दिए गए regexp से मेल खाने वाली रेखाओं को बस डालें या हटाएं। मुझे इस मामले के लिए एनालॉग चाहिए, जब परिवर्तन दो लाइनों के बीच होते हैं (बल्कि लाइनों को डालें या हटाएं)।diff कमांड में कुछ अंतरों को कैसे नजरअंदाज करें?

उदाहरण के लिए, मैं "abXd" और "abYd" के बीच की तरह सभी मतभेद, X और Y दिया के लिए अनदेखा करना चाहते।

ऐसा लगता है कि diff ऐसी क्षमता नहीं है। diff के लिए कोई उपयुक्त विकल्प है?

उत्तर

18

आप जिन लाइनों की परवाह नहीं करते हैं उन्हें खत्म करने के लिए आप दो फ़ाइलों को sed के माध्यम से फ़िल्टर कर सकते हैं। दो रेगेक्स से मेल खाने वाली रेखाओं के बीच कुछ भी हटाने के लिए सामान्य पैटर्न /regex1/,/regex2/ d है। उदाहरण के लिए:

diff <(sed '/abXd/,/abYd/d' file1) <(sed '/abXd/,/abYd/d' file2) 
+1

उत्तर के लिए धन्यवाद। 'sed'/regex/d 'file'' file' में सभी पंक्तियों को हटा देता है जहां 'regex' का मिलान होता है। क्या रेखा को हटाने का कोई तरीका नहीं है बल्कि इसका मिलान हिस्सा है? – Vahagn

+0

मुझे यकीन नहीं है कि आप वास्तव में क्या करना चाहते हैं। क्या आप अपने प्रश्न को दो फाइलों के उदाहरण के साथ संपादित कर सकते हैं जिन्हें आप अलग करना चाहते हैं और आप परिणाम क्या चाहते हैं? –

+0

दुर्भाग्यवश, यह स्पष्ट कारणों से रिकर्सिव ('-r') diff के साथ काम नहीं करेगा। –

0

मान लीजिए एक्स और वाई एकल वर्ण हैं, तो -I 'ab[XY]d' मेरे लिए ठीक काम करता है।

+0

और मुझे भी के लिए। – user2023370

+6

यह पूरी तरह से लाइन को अनदेखा करता है। यदि उस लाइन में अन्य अंतर हैं जिन पर आप परवाह करते हैं, तो यह उन्हें छुपाएगा। – CoatedMoose

18

जॉन Kugelman द्वारा earlier solution में सुधार करने से:

diff <(sed 's/ab[XY]d/abd/g' file1) <(sed 's/ab[XY]d/abd/g' file2) 

शायद है कि आप क्या खोज की जा सकती है! यह संस्करण लाइन को हटाने के बिना प्रत्येक पंक्ति पर विशिष्ट परिवर्तन को सामान्यीकृत करता है। यह लाइन पर बने अन्य अंतर दिखाने के लिए diff को अनुमति देता है।

1

आप एक मानक तार के साथ पैटर्न के उदाहरण को बदलने के लिए एसईडी इस्तेमाल कर सकते हैं:

diff <(sed 's/ab[XY]d/ab__REPLACED__d/g' file1) <(sed 's/ab[XY]d/ab__REPLACED__d/g' file2)