लिनक्स पर दो फ़ाइलों के बीच व्हाट्सएप में अंतर


15

मेरे पास दो फाइलें हैं, जब मैं अंतर के साथ तुलना करता हूं कि हर पंक्ति बदल गई है। जब मैं उनकी तुलना diff -w(व्हॉट्सएप को नजरअंदाज) करता हूं तो यह उन कुछ न्यूनतम बदलावों को दिखाता है जिनकी मुझे उम्मीद है।

जाहिर है कि प्रत्येक फ़ाइल में व्हॉट्सएप के बीच कुछ अंतर है, लेकिन मुझे नहीं पता कि वे क्या हैं या उन्हें कैसे खोजना है। मैंने यह सुनिश्चित करने के लिए फाइलों को संपादित करने की कोशिश की है कि व्हाट्सएप वास्तव में अंतरिक्ष वर्ण (टैब के विपरीत) है, लेकिन यह अनिश्चित है कि क्या करना है।

मैंने :set list onपुष्टि की है कि लाइनों के अंत में कोई अनुगामी स्थान नहीं था।

मेरा यह भी मानना ​​है कि प्रत्येक फ़ाइल में लाइन लाइन टर्मिनेटर होते हैं क्योंकि vim ^Mलाइनों के अंत में नहीं दिखा था ।


1
क्या आपने व्हॉट्सएप (एक पंक्ति के अंत में) के लिए जाँच की है? ऐसे स्थान का पता लगाया जाएगा diffलेकिन कई संपादकों को, वैसे भी, डिफ़ॉल्ट रूप से यह स्थान दिखाई नहीं देता है।
जॉन 1024

अच्छा सुझाव। मैंने ": सेट सूची" के साथ vim का उपयोग किया "यह लाइन के अंत में" $ "दिखा और कोई अनुगामी स्थान नहीं था। मैं अपना प्रश्न अपडेट करूंगा
Romski

यदि आप एक vimउपयोगकर्ता हैं, तो क्या आपने vimdiff file1 file2यह देखने की कोशिश की है कि अंतर क्या हैं?
जॉन 1024

@ John1024 मैं vimdiff से अनजान था, लेकिन यह आशाजनक लग रहा है। इसे उत्तर के रूप में जोड़ें और मैं स्वीकार करूंगा
रोम्सकी

1
विम दिखाता है ^ एम केवल जब यह एक यूनिक्स लाइन को समाप्त करता है, लेकिन फ़ाइल में वास्तव में डॉस लाइन समाप्त होती है। आमतौर पर ऐसा तब होता है जब आपको मिली-जुली लाइन सिंगल फाइल में खत्म हो जाती है, जैसे कि ओरिजिनल फाइल के मुकाबले अलग लाइन के साथ पैच लगाना। जब विम सही तरीके से समाप्त हो रही डॉस लाइन का पता लगाता है, तो यह ^ M नहीं दिखा होगा।
रेयान

जवाबों:


7

के लिए vimउपयोगकर्ताओं, वहाँ फ़ाइलों के बीच सटीक अंतर दिखाने एक आसान उपयोगिता है:

vimdiff file1 file2

यह प्रत्येक फाइल को विंडोज़ में, साइड-बाय-साइड और रंग में हाइलाइट किए गए अंतर के साथ रखेगा।

जब में कुछ उपयोगी आदेश vimdiff

जबकि vimdiff, कुछ उपयोगी आदेश हैं:

  • ]c: अगले परिवर्तन के लिए कूदो

  • [c: पिछले परिवर्तन के लिए कूदो

  • ctrl-W ctrl-W: अन्य विंडो पर स्विच करें

  • zo: खुली तह

  • zc: बंद तह

उदाहरण

यहाँ एक विन्यास फाइल के दो संस्करणों की तुलना vimdiffमें एक उदाहरण दिया गया है:xtermcups

यहां छवि विवरण दर्ज करें

आप देख सकते हैं कि समान रेखाओं के लंबे खंड ढह गए हैं। उन्हें फिर से खोला जा सकता है zo

आपकी विकल्प सेटिंग के आधार पर रंग योजना अलग-अलग होगी। उपरोक्त उदाहरण में, जब एक लाइन एक फ़ाइल में दिखाई देती है, लेकिन दूसरी नहीं, तो उस लाइन को एक गहरे नीले रंग की पृष्ठभूमि दी जाती है। दूसरी फ़ाइल में, गायब लाइनों को धराशायी लाइनों द्वारा दर्शाया गया है। जब दोनों फ़ाइलों में एक रेखा दिखाई देती है लेकिन कुछ अंतर होते हैं, तो लाइनों के अपरिवर्तित भागों में एक गुलाबी पृष्ठभूमि होती है और परिवर्तित भागों में एक लाल पृष्ठभूमि होती है।


14

फ्रीबीएसडी या अधिकांश लिनक्स सिस्टम पर, आप cat -v -e -tव्हॉट्सएप के अंतर को दिखाने के लिए अलग-अलग आउटपुट को पाइप कर सकते हैं ।

diff file1 file2 | cat -vet

टैब के रूप में दिखाया जाएगा ^I, $प्रत्येक पंक्ति के अंत में एक दिखाया जाएगा ताकि आप अनुगामी व्हाट्सएप को देख सकें, और गैर-वर्णक अक्षर ^Xया के रूप में प्रदर्शित किए जाएंगे M-X

यदि आपके पास जीएनयू कोरुटिल्स (अधिकांश गैर-व्यस्त बॉक्स लिनक्स वितरण पर उपलब्ध है), तो इसे सरल बनाया जा सकता है

diff file1 file2 | cat -A

बिजीबॉक्स सिस्टम पर, का उपयोग करें catv -vet


2

क्या विंडोज़ मशीन पर संपादित की गई फ़ाइलों में से एक थी?

विंडोज पर मानक लाइन समाप्ति CRLF है, जहां लिनक्स पर यह केवल एलएफ है (और मैक पर यह सीआर हुआ करता था, लेकिन मुझे संदेह है कि यह ओएस एक्स के बाद से बदल गया है)।

wc -lफ़ाइलों पर प्रयास करें और देखें कि कितनी लाइनें हैं, फिर देखें कि क्या आकार अंतर लाइनों की संख्या के समान है (अंतिम पंक्ति एक फ़ाइल में समाप्त नहीं हो सकती है)।


जल्दी जवाब देने का शुक्रिया। लाइन काउंट करना यह दर्शाता है कि एक फ़ाइल में 5 और लाइनें हैं (मुझे उम्मीद है कि मैंने संपादन किया है)। मुझे लिनक्स मशीन से एक फ़ाइल मिली और दूसरे को लिनक्स पर कोड रिपॉजिटरी से चेक किया गया। मेरा मानना ​​है कि vim में विंडोज टर्मिनेटर वाली फाइल को देखने पर अंतिम वर्ण ^ M के रूप में दिखाई देगा और ऐसा नहीं है।
रॉम्स्की

3
विम वास्तव में लाइन समाप्ति को स्वचालित करने के लिए पर्याप्त स्मार्ट है, विवरण के लिए stackoverflow.com/questions/3852868 देखें।
बाड़पोस्ट

मुझे इस बारे में पता नहीं था! मैं फिर से जाँच करूँगा
रोमस्की

2

odमदद कर सकता है। ऑक्टल डंप कमांड हेक्साडेसिमल में सामग्री दिखा सकता है। यह आपको यह देखने में मदद कर सकता है कि किसी बाइट या अनपेक्षित सफेद स्थान सहित बाइट्स एक फ़ाइल में है। संभावित सामान्य कारण LF बनाम CRLF, रिक्त स्थान बनाम टैब या ASCII बनाम यूनिकोड हो सकते हैं (जो प्रायः प्रत्येक सामान्य रूप से दिखाई देने वाली बाइट से पहले एक अशक्त बाइट हो सकता है)। od -x filenameउनमें से किसी भी पैटर्न को प्रकट करना चाहिए। यदि आप फ़ाइल को देखने के लिए अधिक विस्तृत तरीका चाहते हैं, तो कोई भी "हेक्स संपादक" अच्छी तरह से कर सकता है। इसके बारे odमें अच्छी बात यह है कि cutकमांड की तरह , यह कई यूनिक्स प्रणालियों में बनाया गया है। तो, अक्सर, कोई अलग स्थापना आवश्यक नहीं है।

यदि आपको अधिक समान होने के लिए फ़ाइलों की आवश्यकता है, trतो कुछ परिवर्तन sedकर सकते हैं , और अधिक कर सकते हैं। मैं शायद ls -lयह देखना शुरू करूंगा कि कौन सी फ़ाइल बड़ी है, फिर बाइट्स देखें कि क्या बदलना है, और फिर एक फाइल को बदल दें ताकि वे अधिक समान लगें।


1

यह पता लगाने के लिए कि असली व्हाट्सएप और टैब आप कहां हैं sedउदाहरण के लिए उनका उपयोग कर सकते हैं :

$ cat file
  line 1
  line 2
    line 6
        line 7
$ sed 's/ /-/g; s/\t/<tab>/g' file
--line-1
--line-2
<tab>line-6
<tab><tab>line-7

और अब दो फाइलों की तुलना करें।


इससे भी बेहतर, आप उस फ़िल्टर को अलग आउटपुट पर चला सकते हैं। या आप में पहले से तैयार फिल्टर इस्तेमाल कर सकते हैं catके रूप में, superuser.com/a/913368/37154
clacke

0

उपरोक्त सामग्री को यहां "प्रश्न" अनुभाग से ऊपर कॉपी किया गया था, जिसे रोम्स्की ने लिखा था।

दोनों vimdiffऔर diff file1 file2 | cat -Aएक उपकरण के नजरिए से बहुत उपयोगी थे।

अंत में, मुझे एक और मुद्दा मिला। मेरी कुछ फाइलें UTF-8 BOM के साथ एनकोडेड थीं। इसका उपयोग करते हुए प्रकाश डाला गया था diff file1 file2 | cat -A। यह M-oM-;M-?प्रभावित फ़ाइल की शुरुआत में ही प्रकट होता है :

$ diff file1 file2 | cat -A
< package com.mycompany;$
---$
> M-oM-;M-?package com.mycompany;$

जब भी कई मुद्दे थे, मैंने अपनी फ़ाइलों को साफ़ करने की आवश्यकता के लिए नीचे कुछ आदेशों को सूचीबद्ध किया है:

# recursively remove UTF8 BOM
find . -type f -exec sed -i -e '1s/^\xEF\xBB\xBF//' {} \;

# recursively replace CRLF with LF
find . -type f -print0 | xargs -0 dos2unix
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.