sed FreeBSD और Linux पर अलग-अलग व्यवहार करता है?


12

मैं लिनक्स और फ्रीबीएसडी दोनों का उपयोग करता हूं (विशेष रूप से, मैं डेबियन लिनक्स और पीसी-बीएसडी का उपयोग करता हूं), और मुझे कुछ अजीब लगा sed

मुझे बार-बार "टैब अलग किए गए मान" फ़ाइलों को "अल्पविराम से अलग मान" में बदलने की आवश्यकता है। सबसे आसान तरीका मुझे पता है sed, इस तरह से उपयोग करना है :

sed 's/\t/,/g' inputFile.txt > outputFile.csv

यह पूरी तरह से लिनक्स पर काम करता है: यह हर टैब को अल्पविराम से बदल देता है ... लेकिन FreeBSD पर, यह कुछ भी प्रतिस्थापित नहीं करता है !!!

क्या मैं कुछ भूल रहा हूँ? क्या फ्रीबीएसडी के साथ एक वाक्यविन्यास है sedजो लिनक्स पर एक से अलग है?

जवाबों:


9

हो सकता है कि आपको GNU Sed के साथ संगतता रखने के लिए -Eविकल्प (या -rजैसा कि मैनुअल पर समझाया गया है ) का उपयोग करना चाहिए । आपके मामले में, आप ग्नू सेड को स्थापित कर सकते हैं यदि आप इसका उपयोग करते हैं ( फ्रीबीएसडी पर पोर्ट किया गया), या यह स्क्रिप्ट को पोर्ट करने के लिए एक लंबा प्रयास करेगा।

और याद रखें। अगर बीएसडी पर कुछ कमांड उस उपयोगिता के गन्न संस्करण की तरह काम नहीं करता है, तो इसका मतलब यह नहीं है कि यह टूट गया है;)


1
धन्यवाद। -Eविकल्प चाल (दोनों FreeBSD पर और मैक ओएस एक्स पर) बनाता है।
बैरनका

मेरे FreeBSD 9 पर -E विकल्प मदद नहीं करता है।
आर्क-कुन

6

हां, विभिन्न अंतर हैं, मेरे सिर के ऊपर से केवल एक ही होने का व्यवहार-i

मैंने बीएसडी का उपयोग कभी नहीं किया है इसलिए मैं वास्तव में विवरण के साथ मदद नहीं कर सकता लेकिन trइसके बजाय एक वर्कअराउंड का उपयोग किया जा सकता है :

tr '\t' , < inputFile.txt > outputFile.csv

एक सुखद दुष्प्रभाव यह है कि trकाफी तेज होना चाहिए। मैंने अपने लिनक्स पर 50000 लाइनों के साथ एक परीक्षण फ़ाइल का उपयोग करके परीक्षण किया, जिसमें से प्रत्येक में 2 टैब थे:

$ time tr '\t' , < foo.txt > /dev/null 

real    0m0.004s
user    0m0.000s
sys     0m0.000s

$ time sed 's/\t/,/g' foo.txt > /dev/null 

real    0m0.039s
user    0m0.036s
sys     0m0.000s

tr '\t' ,से अधिक पोर्टेबल है tr $'\t' ,tr '[\t]' '[,]'कुछ पुराने SysV सिस्टम के लिए भी पोर्टेबल होगा।
स्टीफन चेजेलस

टैब के लिए डिफ़ॉल्ट सीमांकक है cut। के लिए POSIX कल्पना trहै वहाँ । मैं [पुराने SysV के लिए आवश्यक के बारे में गलत था । उस POSIX कल्पना बिंदु के रूप [में केवल वहाँ सीमाओं के लिए आवश्यक है।
स्टीफन चेजेलस

@StephaneChazelas तो यह है, मुझे यकीन नहीं है कि मैं इसके साथ भ्रमित कर रहा हूँ। किसी भी मामले में स्पष्टीकरण के लिए धन्यवाद।
terdon

4

हां, जीएनयू sedफ्रीबीएसडी के विपरीत sedएएनएसआई सी एस्केप अनुक्रमों की व्याख्या \tनियमित अभिव्यक्तियों में नहीं करता है।

इस मामले में कम से कम आम भाजक प्राप्त करने का एक तरीका उपयोग करना है printf

tab="$(printf '\t')"
printf '\t\n' | sed 's/'"${tab}"'/,/g'
printf '\t\n' | sed 's/'"$(printf '\t')"'/,/g'

sed -iइन-प्लेस फ़ाइल संपादन के लिए व्यवहार को संगत बनाया जा सकता है यदि स्विच या विकल्प तुरंत -iस्विच का अनुसरण sed -i -e 's/x/X/g' fileकरता है , उदाहरण के लिए जीएनयू sedऔर फ्रीबीएसडी दोनों के लिए काम करता है sed

FreeBSD के हाल के संस्करणों sed(FreeBSD 8.1 या नए) में -rGNU के साथ संगतता बढ़ाने के लिए स्विच है sed

(इसके अलावा, sedनियमित अभिव्यक्तियों में POSIX वर्ण वर्गों का उपयोग अनुकूलता सुनिश्चित करने का एक अच्छा तरीका है)।

एक विकल्प के लिए, POSIX- अनुरूप sedकार्यान्वयन देखें: छोटा - एक सस्ता, सस्ता SED कार्यान्वयन


3

आपको TABइसके बजाय एक शाब्दिक चरित्र का उपयोग करना चाहिए \t:

sed 's/    /,/g' inputFile.txt > outputFile.csv

स्टीफन की इस टिप्पणी को एक अन्य प्रश्न पर देखें ।

निम्नलिखित लेख भी आपकी रुचि हो सकती है:

मैं प्रासंगिक हिस्सा उद्धृत करता हूं:

रेगेक्स अंतर

नियमित अभिव्यक्ति वाक्यविन्यास SED के विभिन्न संस्करणों के बीच अलग-अलग होता है। अधिकांश अंतरों में गैर-मुद्रण वर्णों से मेल खाने के लिए उपयोग किए जाने वाले विशेष एस्केप पैटर्न शामिल होते हैं, जैसे ASCI घंटी और फॉर्म फीड।


0

लॉगिन के बाद मैं अगली घोषणा देखता हूं और इसे सहेजता हूं। आशा है कि यह अन्य के लिए भी उपयोगी होगा

जगह में एक फ़ाइल को संपादित करने के लिए sed (1) का उपयोग करना चाहते हैं? ठीक है, हर 'ई' को 'ओ' से बदलने के लिए, 'फू' नाम की फाइल में, आप कर सकते हैं:

sed -i.bak s/e/o/g foo

और आपको 'foo.bak' नाम की फ़ाइल में मूल का बैकअप मिलेगा, लेकिन यदि आप कोई बैकअप नहीं चाहते हैं:

sed -i '' s/e/o/g foo

-iविकल्प था पहले से ही कवर हालांकि,
जेफ स्कालर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.