एक अंतर में स्थानांतरित लाइनों को कैसे अनदेखा करें


8

मैं वर्तमान में एक स्रोत कोड जनरेशन टूल पर काम कर रहा हूं। यह सुनिश्चित करने के लिए कि मेरे परिवर्तन किसी नए कीड़े का परिचय नहीं देते हैं, ए diff मेरे परिवर्तनों के पहले और बाद के कार्यक्रम के आउटपुट के बीच सैद्धांतिक रूप से एक मूल्यवान उपकरण होगा।

हालाँकि, यह एक से अधिक कठिन हो सकता है लगता है, क्योंकि उपकरण उन लाइनों को आउटपुट करता है जहां ऑर्डर मायने नहीं रखता (जैसे) import एक अर्द्ध बेतरतीब ढंग से बयान, समारोह घोषणाओं, ...)। इस वजह से, का उत्पादन diff कई परिवर्तनों के साथ बरबाद होता है जो वास्तव में उसी फ़ाइल में किसी अन्य स्थिति में स्थानांतरित की गई लाइनें हैं।

क्या इन चालों को अलग-अलग अनदेखा करने का एक तरीका है और केवल उन लाइनों का उत्पादन करना है जिन्हें वास्तव में जोड़ा गया है या हटाया गया है?


हो सकता है कि किसी विशिष्ट (जैसे कि आपकी भाषा में संभव हो) आदेश में फ़ंक्शन और आयात घोषणाओं को उत्पन्न करने के लिए अपने टूल को बदलना आसान हो?
Daniel Beck

@ डैनियल बेक: नीचे दिए गए गिल्स के जवाब के लिए मेरी टिप्पणी देखें।
klickverbot

पुराना विषय है, लेकिन नीचे टिप्पणियों को संक्षेप में बताएं, यह कैसे होगा diff उपकरण अमान्य चाल से वैध चाल को अलग करने में सक्षम हो सकता है, कोड में निर्देशों का आदेश कर देता है मामला, और ऐसे मामले जहां यह सच नहीं है, सीमित हैं (आयात, कार्यों और वर्गों की घोषणा, आदि)।
Joël

@ जोएल: इसका उत्तर बस इतना है कि मुझे पता था कि जिन जनरेटर परिवर्तनों का मुझे परीक्षण करना था, वे लाइनों के क्रम को बदलने से संबंधित किसी भी कीड़े का परिचय नहीं देंगे। बेशक, आपको सामान्य मामले में झूठी सकारात्मकता से बचने के लिए लक्ष्य भाषा के लिए एक पार्सर पर आधारित उपकरण की आवश्यकता होती है (या आपके जनरेटर के लिए बस एक व्यापक परीक्षण सूट), लेकिन यह इसके अलावा एक त्वरित एक-बंद चेक होना चाहिए था कोड की समीक्षा करने के लिए।
klickverbot

जवाबों:


2

आप एक सरल अंतर कर सकते हैं, परिणाम को कहीं और स्टोर कर सकते हैं (एक और अंतर से बचने के लिए), किसी भी संस्करण में लाइनों के माध्यम से लूप करें, फिर उन्हें दूसरी तरफ से हटा दें।

इससे अचेत हो गया अलग परियोजना कार्य कोड के लिए। कोड।


मुझे यकीन नहीं है कि वास्तव में क्या करना चाहिए, लेकिन यह वांछित परिणाम नहीं लगता है। जैसा कि मैं प्रश्न को समझता हूं, कोड में दो उदाहरणों से /tmp/old तथा /tmp/new कोई भिन्न परिणाम नहीं चाहिए क्योंकि अभी-अभी रेखाएँ इधर-उधर की गई हैं। हालाँकि यह कोड परिणाम देता है।
Ilari Kajaste

कोड तय किया।
l0b0

उत्तर का परीक्षण नहीं किया है क्योंकि मैंने एक लंबे समय से ऊपर बताई गई विलय प्रक्रिया को समाप्त कर दिया है, लेकिन कोड की एक नज़र से ऐसा लगता है कि यह काम कर सकता है।
klickverbot

3

आप पहले सॉर्ट करने का प्रयास कर सकते हैं। कुछ इस तरह:

sort file-a > s-file-a
sort file-b > s-file-b
diff s-file-a s-file-b

बैश (और zsh) इसके साथ एक लाइन में कर सकते हैं प्रक्रिया प्रतिस्थापन

diff <(sort file-a) <(sort file-b)

यह एक विकल्प हो सकता है, लेकिन उत्पन्न भिन्नता तब बहुत उपयोगी नहीं होगी, क्योंकि मैं सभी लाइन नंबर और संदर्भ जानकारी खो देगा ...
klickverbot

यहां तक ​​कि अगर मैं अभी भी एक बेहतर समाधान की उम्मीद कर रहा हूं, तो मैं इस दृष्टिकोण के साथ चला गया कि मैं जिन परिवर्तनों पर काम कर रहा था, उनके बैच की पुष्टि करने के लिए।
klickverbot

2
मैं सोच सकता हूं कि इसमें कुछ बदलाव कहां होंगे। कभी-कभी आदेश जारी करते हैं, कभी-कभी ऐसा नहीं होता है। आप सभी संदर्भों को त्याग देते हैं।
Rich Homolka

एक आदेश देने वाले रिफ्लेक्टर के लिए जहां मैं यह सुनिश्चित करना चाहता था कि जो कुछ भी मौजूद था वह अभी भी करता है, यह वही था जो मुझे चाहिए था।
ntrrobng

0

ऐसा लगता है कि आपके पास उपकरण पर नियंत्रण है। फिर इसके आउटपुट को अनुमानित करें: अर्ध-यादृच्छिक क्रम में घोषणाओं को छोड़ने के बजाय, अंतिम उपाय के रूप में वर्णमाला क्रम का उपयोग करें (कहें)। इससे न केवल अलग-अलग बेकार बेकार को हटाने का लाभ होगा, बल्कि उपकरण के आउटपुट को पढ़ने और मानव के लिए सत्यापित करने में भी आसानी होगी।


क्षमा करें, लेकिन यह उत्तर मुझे बिल्कुल मदद नहीं करता है - अगर यह इतना आसान था, तो मैं इसे तुरंत बदल दूंगा। इसके अलावा, मैं वर्तमान में एक परियोजना से बदलाव को विलय कर रहा हूं, जनरेटर मूल रूप से कांटा गया था, इसलिए इस तरह के दूरगामी परिवर्तन को जोड़ने से उस प्रक्रिया को और भी अधिक जटिल हो जाएगा ...
klickverbot

0

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

उदाहरण के लिए, मैंने सिर्फ दो MySQL डंप पर डेटाबेस नामों में से कुछ को बदलने के बाद उनकी तुलना करने के लिए ऐसा किया था (और इसलिए डंप ने उन्हें एक अलग क्रम में सूचीबद्ध किया):

csplit all-07sep2015-11:19:12.sql '/Current Database/-1' '{*}'  # split the dump made before the change, creating files xx00, xx01, ...
csplit -f yy all-07sep2015-12:26:12.sql '/Current Database/-1' '{*}' # split the dump made after the change, creating files yy00, yy01, ...
fgrep 'Current Database' xx?? yy?? | perl -lne 'BEGIN{my %foo}; /(^....).*`(.*)`/ and push(@{$foo{lc($2)}}, $1); END {printf("diff -di %s %s\n", @{$_}) for values %foo}' | sh -x | less  # match the pairs and compare them with diff
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.