2013-10-06 1 views
7

मानक diff उपकरण भिन्न फ़ाइल में लाइनों को खोजने के लिए बहुत उपयोगी है, लेकिन यह चरित्र-दर-चरित्र मतभेदों के लिए अच्छा काम नहीं करता है। मुझे अक्सर विभिन्न कंप्यूटरों पर सिंक्रनाइज़ेशन के बिना ग्रंथों के चरित्र-दर-चरित्र (यानी लिखित पाठ, कोड नहीं) को मर्ज करने की आवश्यकता होती है (हाँ, मुझे पता है कि मुझे नहीं करना चाहिए, लेकिन यह वैसे भी होता है)। अनुच्छेद या दो जोड़ने के अलावा, मैंने एक अल्पविराम, एक वर्तनी गलती या पाठ में कुछ अन्य छोटे बदलाव को बदल दिया होगा जो पहले दोनों फाइलों के लिए आम था।मैं कमांड लाइन से पोर्टेबल, पठनीय और पाइप करने योग्य चरित्र-दर-चरित्र भिन्नता कैसे करूं?

डिफ मुझे बताएगा कि कौन सी रेखाएं बदली गई हैं, लेकिन चूंकि प्रति पंक्ति में कई भिन्नताएं हो सकती हैं, इसलिए मुझे प्रत्येक भौतिक रूप से छोटे लेकिन महत्वपूर्ण अंतर प्रति पंक्ति को खोजने के लिए सावधानी से लाइनों को स्कैन करना होगा। फिक्सिंग के बाद, मुझे यह सुनिश्चित करने के लिए diff को दोहराना होगा कि मुझे कोई संपादन याद नहीं आया है। जब रेखाएं अनुच्छेद स्वरूपित होती हैं (यानी प्रति अनुच्छेद एक पंक्ति), और जब कई लगातार पंक्तियों में ऐसे छोटे अंतर होते हैं तो यह और भी बदतर हो जाता है।

अभी मुझे यह स्वीकार करना होगा कि मैं आमतौर पर दोनों फ़ाइलों को माइक्रोसॉफ्ट वर्ड में लोड करता हूं और इसके अंतर्निर्मित diff फ़ंक्शन का उपयोग करता हूं। यह निश्चित रूप से कुछ छोटे अंतर खोजने के लिए वर्ड जैसे विशाल पैकेज को शुरू करने के लिए असुविधाजनक है, लेकिन कम से कम यह एक चरित्र-दर-चरित्र आधार पर फ़ाइलों की तुलना करता है।

जो मैं वास्तव में चाहता हूं वह ऐसा करने का यूनिक्स तरीका है। एक छोटा और प्यारा टूल या स्क्रिप्ट जो टेक्स्ट पर चरित्र-दर-चरित्र तुलना करता है, यानी लाइन आधारित, लाइन-एंडिंग को अनदेखा करने में सक्षम, कुछ समझदार एसीआई-कला द्वारा रिपोर्टिंग, और कमांड से स्क्रिप्ट में उपयोग के लिए पूरी तरह से पाइप करने योग्य लाइन?

इस के लिए एक और सवाल है, Using 'diff' (or anything else) to get character-level diff between text files, लेकिन यह प्रश्न वेब आधारित टूल द्वारा उदाहरण के लिए एक lib द्वारा संतुष्ट था, मैं कमांड लाइन पर कुछ पसंद करूंगा।

+0

एक ही सवाल यह भी कहा गया अजगर [difflib] (http://docs.python.org/library/difflib .html) और एक [कमांड लाइन] (http://docs.python.org/library/difflib.html#a-command-line-interface-to-difflib) इंटरफ़ेस। क्या आपने कोशिश की? – devnull

+0

नहीं, मैंने यह नहीं देखा कि, मैं इसे देख लूँगा! मैं उम्मीद कर रहा था कि इसके लिए एक मानक मानक पैकेज था (यानी दुह! हर कोई लेकिन आप जानते हैं कि आपको इसका उपयोग करना चाहिए: ...), लेकिन ऐसा लगता है कि यह एक कठिन समस्या है मैंने सोचा था। – 00prometheus

+0

आप प्रत्येक चरित्र को अपनी लाइन में डाल सकते हैं और उस पर एक diff-tool का उपयोग कर सकते हैं। –

उत्तर

4

मुझे यकीन नहीं है कि यह आपके "कमांड लाइन" मानदंडों को पूरा करेगा, लेकिन मैं इस उद्देश्य के लिए प्रतिदिन gvim/vim का उपयोग करता हूं।

  1. फ़ाइलें खोलें आप इस तरह diff हैं:

    gvim -d file1 file2 
    
  2. खिड़की पूर्ण स्क्रीन बनाएं ताकि यह आसान है देखने के लिए

  3. gvim बराबर आकार के अंदर विभाजन खिड़कियों बनाओ आदेश के साथ: C-w = (वह नियंत्रण + डब्ल्यू है और फिर =)

  4. पैरा स्वरूपित लाइनों बेहतर देखने के लिए, :set wrap दर्ज करें, फिर C-w w (या माउस-क्लिक के अनुसार) के साथ अन्य विभाजित खिड़की करने के लिए स्विच और वहाँ भी दर्ज :set wrap

  5. परिवर्तन के बीच ले जाने के लिए, [c और ]c का उपयोग करें। परिवर्तनों को मर्ज करने के लिए, dp ("diff put") और do ("diff get/get") का उपयोग करें।

मतभेदों वाली रेखाएं हाइलाइट की गई हैं, और रेखा के भीतर अंतर को अन्य रंग के साथ भी हाइलाइट किया गया है। मुझे आशा है कि यह वही करता है जो आपको चाहिए। gvim आपके लिए और भी कुछ कर सकता है, जैसे एक फ़ाइल से दूसरे में विलय करना। आप कमांड :help diff (gvim के अंदर) के साथ और अधिक जानकारी प्राप्त कर सकते हैं।

आप kdiff3 भी कोशिश कर सकते हैं, यह vim सीखने से आसान हो सकता है।

+0

धन्यवाद जेनोस, मुझे नहीं पता था कि विम ऐसा कर सकता है! यह शुरू करने के लिए बहुत तेज़ है शब्द की तुलना में vim, और vim -d मोड वर्ड करता है सब कुछ करता है। मैं अभी भी एक शुद्ध कमांड लाइन उपकरण की कामना करता हूं, ताकि मैं इसे पाइप में उपयोग कर सकूं और ऐसा हो सकता है, लेकिन शायद मैं जो चाहता हूं उसके लिए एक मानक उपकरण नहीं है। मुझे खेद है कि मेरे पास आपके उत्तर को वोट देने के लिए बहुत कम अंक हैं, लेकिन शायद कोई और कर सकता है? – 00prometheus

0

ऐसा लगता है कि हम सबसे नज़दीकी पाते हैं जो janos द्वारा vimdiff उत्तर है, हालांकि यह कमांड लाइन नहीं है।

एक करीबी विकल्प जो अच्छी तरह से समर्थित है, प्रमुख वितरण (जैसे डेबियन, और यहां तक ​​कि सिगविन), कमांड लाइन और पाइपेबल में शामिल है, साथ ही साथ लाइन-एंडिंग को अनदेखा करने में सक्षम wdiff है। wdiff मानक diff के समान ही उपयोग किया जा सकता है। दुर्भाग्यवश, यह चरित्र आधारित नहीं है, यह शब्द आधारित है।

मानव उपयोग के लिए, wdiff शायद काफी करीब है; एक शब्द के भीतर एक चरित्र चरित्र मिलान करना त्वरित और आसान है। मुख्य नुकसान यह है कि यदि इसका उद्देश्य एकल पात्रों को ढूंढना है तो इसका उपयोग प्रोग्राम और स्क्रिप्ट में नहीं किया जा सकता है।

वहाँ वास्तव में किसी भी समर्थित आदेश-पंक्ति चरित्र आधारित diff मौजूद प्रतीत नहीं करता है :-(।

संबंधित मुद्दे