2015-02-18 9 views
11

के साथ फ़ाइल की लाइनों को हटाना मैंने sed के साथ चारों ओर बेवकूफ़ बनाते हुए थोड़ा अजीब देखा। यदि आप किसी फ़ाइल से एकाधिक लाइन अंतराल (संख्या द्वारा) को निकालने का प्रयास करते हैं, लेकिन सूची में बाद में निर्दिष्ट किसी भी अंतराल को सूची में पहले अंतराल के भीतर पूरी तरह निहित किया गया है, तो निर्दिष्ट (बड़ा) अंतराल के बाद एक अतिरिक्त एकल पंक्ति हटा दी जाती है।sed - अप्रत्याशित व्यवहार

seq 10 > foo.txt 

sed '2,7d;3,6d' foo.txt 
1 
9 
10 

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

+4

में आपका स्वागत है ओवरफ्लो स्टैक करने के लिए। संक्षेप में, पूर्ण प्रश्न के लिए धन्यवाद। परिणाम दिलचस्प है। मैं इसे अपनी लिपि से दोहरा सकता हूं। दिलचस्प बात यह है कि 'sed' 3,6d; 2,7d 'foo.txt' (रिवर्स ऑर्डर में डिलीट ऑपरेशंस के साथ) उत्पादन में शामिल 8 के साथ अपेक्षित उत्तर उत्पन्न करता है। ऐसा लगता है कि यह एक रिपोर्ट करने योग्य बग (जीएनयू) 'sed' में हो सकता है (मैंने उबंटू 14.04 व्युत्पन्न से' sed (GNU sed) 4.2.2 'का उपयोग करके परीक्षण किया), खासकर बीएसडी 'sed' (मैक ओएस एक्स पर) 10.10.2 योसमेट) किसी भी क्रम में संचालन के साथ सही तरीके से काम करता है। –

+3

मुझे मारता है। मैंने सोचा कि कुछ एसडी आर्केन का निर्माण है कि आप बैटमैन प्रतीक या अपने कमांड के बीच से कुछ खो सकते हैं लेकिन 'sed -e' 2,7d '-e' 3,6d 'foo.txt' वैसे ही व्यवहार करता है और आदेश को स्वैप करने से अपेक्षित परिणाम उत्पन्न होते हैं (सिगविन पर जीएनयू sed 4.2.2)।/सोलारिस पर बिन/sed हमेशा अपेक्षित परिणाम उत्पन्न करता है और दिलचस्प रूप से जीएनयू sed 3.02 करता है। –

+4

[जीएनयू 'sed'] (http://www.gnu.org/software/sed/) होम पेज कहता है "कृपया gnu.org पर बग-sed को बग रिपोर्ट भेजें" (इसके अलावा इसमें '@' है 'पर' की जगह)। आपके पास अच्छा प्रजनन है; आपके द्वारा प्राप्त किए जाने वाले आउटपुट के आउटपुट के बारे में स्पष्ट रहें (वे बिंदु प्राप्त करेंगे, लेकिन यह सुनिश्चित करना सबसे अच्छा है कि वे गलत समझ नहीं सकते हैं)। इंगित करें कि आदेशों के विपरीत क्रम की अपेक्षा की जाती है। आप बीएसडी 'sed' (और सोलारिस संस्करण, और पुराने जीएनयू 3.02 'sed') को अपेक्षित व्यवहार के रूप में भी इंगित कर सकते हैं। पुराने संस्करण जीएनयू 'sed' काम करने के साथ, इसका मतलब है कि यह तर्कसंगत रूप से एक प्रतिगमन है। –

उत्तर

5

चूंकि इस प्रश्न को 2015-02-24 के लिए स्टैक ओवरफ़्लो वीकली न्यूज़लेटर ईमेल में एक उत्तर की आवश्यकता के रूप में हाइलाइट किया गया था, इसलिए मैं ऊपर दिए गए टिप्पणियों को परिवर्तित कर रहा हूं (जो उत्तर प्रदान करता है) औपचारिक उत्तर में। यहां अनधिकृत टिप्पणियां मेरे द्वारा अनिवार्य रूप से समकक्ष रूप में बनाई गई थीं।

संक्षिप्त, पूर्ण प्रश्न के लिए धन्यवाद। परिणाम दिलचस्प है। मैं इसे अपनी स्क्रिप्ट के साथ पुन: उत्पन्न कर सकता हूं। दिलचस्प बात यह है कि sed '3,6d;2,7d' foo.txt (रिवर्स ऑर्डर में डिलीट ऑपरेशंस के साथ) उत्पादन में शामिल 8 के साथ अपेक्षित उत्तर उत्पन्न करता है। इससे ऐसा लगता है कि यह एक रिपोर्ट करने योग्य बग (जीएनयू) sed हो सकता है, खासकर बीएसडी sed (मैक ओएस एक्स 10.10.2 योसमेट पर) किसी भी क्रम में संचालन के साथ सही तरीके से काम करता है। मैंने उबंटू 14.04 व्युत्पन्न से 'sed (GNU sed) 4.2.2' का उपयोग करके परीक्षण किया।

आपके लिए अधिक डेटा अंक। इन दोनों के उत्पादन में 8 में शामिल हैं:

sed -e '/2/,/7/d' -e '/3/,/6/d' foo.txt 
sed -e '2,7d' -e '/3/,/6/d' foo.txt 

इसके विपरीत, यह नहीं करता है:

sed -e '/2/,/7/d' -e '3,6d' foo.txt 

बाद मुझे हैरान कर दिया (चाहे वह बुनियादी बग को स्वीकार)।

मुझे मारता है। मैंने सोचा कि sed के आर्केन संरचनाओं में से कुछ को दिया गया है कि आप बैटमैन प्रतीक या अपने कमांड के बीच से कुछ खो सकते हैं लेकिन sed -e '2,7d' -e '3,6d' foo.txt वैसे ही व्यवहार करता है और ऑर्डर को स्वैपिंग अपेक्षित परिणाम (जीएनयू sed 4.2.2 सिगविन पर) उत्पन्न करता है। सोलारिस पर /bin/sed हमेशा अपेक्षित परिणाम उत्पन्न करता है और दिलचस्प रूप से जीएनयू sed 3.02 करता है। Ed Morton

अधिक डेटा: sed '2,5d;2,5d' बग, sed '2,5d;1,5d' और sed '2,5d;2,6d' नहीं है पता चलता है: यह केवल अगर 2 सीमा पहले के एक सबसेट है sed 4.2.2 के साथ हो रहा है। glenn jackman

GNU sed मुख पृष्ठ कहते हैं, "कृपया बग sed gnu.org पर करने के लिए बग रिपोर्ट भेजें" (सिवाय यह पर 'के स्थान पर एक @ है)। आपके पास अच्छा प्रजनन है; आपके द्वारा प्राप्त किए जाने वाले आउटपुट के आउटपुट के बारे में स्पष्ट रहें (वे बिंदु प्राप्त करेंगे, लेकिन यह सुनिश्चित करना सबसे अच्छा है कि वे गलत समझ नहीं सकते हैं)। इंगित करें कि आदेशों के विपरीत क्रम की अपेक्षा की जाती है, और विभिन्न अन्य आदेशों को काम करने या काम करने के उदाहरण के रूप में नहीं देते हैं।(आप यह क्यू & एक यूआरएल को क्रॉस-रेफरेंस के रूप में भी दे सकते हैं, लेकिन यह सुनिश्चित कर लें कि बग रिपोर्ट स्वयं निहित है ताकि यह समझा जा सके कि कोई भी यूआरएल का पालन नहीं करता है।)

आप भी कर सकते हैं बीएसडी sed (और सोलारिस संस्करण, और पुराने जीएनयू 3.02 sed) को इंगित करने के रूप में इंगित करें। पुराना संस्करण जीएनयू sed काम कर रहा है, इसका मतलब है कि यह तर्कसंगत रूप से एक प्रतिगमन है। [... थोड़ा प्रयोग के बाद ...] ब्रेकेज 4.1 रिलीज में हुआ; 4.0.9 रिलीज ठीक है। (मैंने 4.1.5 और 4.2.1 की भी जांच की; दोनों टूटे हुए हैं।) इससे रखरखाव करने में मदद मिलेगी कि क्या वे क्या बदलते हुए देखकर परेशानी खोजना चाहते हैं।

ओ पी ने कहा:

  • धन्यवाद टिप्पणियों और अतिरिक्त परीक्षण के लिए हर किसी को। मैं जीएनयू sed पर एक बग रिपोर्ट जमा करूंगा और अपनी प्रतिक्रिया पोस्ट करूंगा। santayana
+1

इसे एक साथ रखने के लिए धन्यवाद। मुझे जीएनयू से पुष्टि है कि यह वास्तव में एक बग है और उन्होंने मुझे एक पैच भेजा है जिसे मैंने अभी तक सफलतापूर्वक कार्यान्वित करने में कामयाब नहीं किया है। एक बार जब मैं पुष्टि कर सकता हूं कि पैच व्यवहार को ठीक करता है तो मैं इसे पोस्ट करूंगा। – santayana

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