-देशी कमांड का उद्देश्य क्या है?


41

मुझे sed -eस्विच के बारे में कोई दस्तावेज नहीं मिल सकता है , साधारण प्रतिस्थापन के लिए, क्या मुझे इसकी आवश्यकता है?

जैसे

sed 's/foo/bar/'

वी.एस.

sed -e 's/foo/bar/'

14
क्या आप वाकई इसमें नहीं मिले हैं man sed?

4
आप पोटैंग्स स्पष्टीकरण नहीं ढूंढते, "cmd1; cmd2" का उपयोग क्यों नहीं करते
उपयोगकर्ता अज्ञात

जवाबों:


28

मैन पेज से:

-e script, --expression=script

    add the script to the commands to be executed

तो आप -eकई भागों में से एक स्क्रिप्ट बनाने के लिए कई विकल्पों का उपयोग कर सकते हैं ।

$ sed -e "s/foo/bar/" -e "/FOO/d"

पहली जगह लेंगे fooसाथ barऔर फिर से युक्त हर पंक्ति को हटा दें FOO


3
तो, आपको '-ई' की आवश्यकता नहीं है यदि आपके पास केवल एक स्क्रिप्ट है, है ना?
जॉनीटेक्स

मैं भी, -e
टाइपऑलोजिक

27

यह आपके लिए काम कर सकता है:

sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file

प्रत्येक मामले में i(डालें), a(परिशिष्ट) और c(परिवर्तन) आदेशों को एक नई पंक्ति द्वारा समाप्त करने की आवश्यकता है।

आम तौर पर आदेशों को एक ;उदाहरण के /foo/d;/bar/dआधार पर अलग किया जा सकता है और {...} द्वारा वर्गीकृत किया जा सकता है, /foo/{h;d}लेकिन i,a,cआदेशों के लिए आदेशों को -eअलग करने का एक तरीका प्रदान करता है।

विकल्प एक नई पंक्ति सम्मिलित करने के लिए शेल (बैश) का उपयोग करना है:

sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file

1
कम से कम कुछ सीड इम्प्लीमेंटेशन (उदाहरण के लिए, फ्रीबीएसडी पर), आपको सेमीकॉल के -eसाथ-साथ लेबल और ब्रांच कमांड को भी नए सिरे से इस्तेमाल करने की जरूरत है । यह काम नहीं करेगा sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm":। लेकिन यह होगा:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
dubiousjim

मुझे यकीन नहीं है कि must be terminated with a newlineयहां वाक्यांश का मतलब कितना आवश्यक है । जब मैंने यहाँ अपने में परीक्षण किया cygwin, तो यह काम करता है sed '/foo/i\bar' file:। इसलिए अब जब हम अलग-अलग भावों को एक साथ जोड़ सकते हैं, तो यह फिर से मूल प्रश्न पर उठता है: इसका असली उद्देश्य क्या है -e?
टाइपेलॉजिक

1

-e, के बराबर है --expression, वैकल्पिक है, जब तक कि आप कई अभिव्यक्तियों को एक साथ (सामान्य नहीं) स्ट्रिंग कर रहे हैं जैसा कि दूसरे उत्तर में दिखाया गया है ।

एक तरफ: ;एक ही अभिव्यक्ति के बजाय एक के बाद एक कई भावों को निष्पादित करने के लिए उपयोग किया जा सकता है।


0

मदद के लिए sedआप पाएंगे कि -eझंडा खड़ा है:

 -e script, --expression=script
                 add the script to the commands to be executed

लेकिन आप मुठभेड़ के बाद भ्रमित होने वाले पहले व्यक्ति नहीं हैं -e। आपके उदाहरण में sed 's/foo/bar/'और sed -e 's/foo/bar/'समतुल्य हैं। दोनों ही मामलों s/foo/bar/में स्क्रिप्ट है जिसे sed द्वारा निष्पादित किया जाता है। दूसरा विकल्प अधिक स्पष्ट है, लेकिन यह संभवतः वह कारण नहीं है जिसे आप अक्सर -eउपयोग करते देखते हैं । इसका कारण यह है कि -eएक ही आह्वान के साथ एक से अधिक स्क्रिप्ट का उपयोग करना संभव बनाता है sed। यह अभी भी सवाल छोड़ देता है कि यदि आप केवल एक स्क्रिप्ट का उपयोग कर रहे हैं तो इसका उपयोग क्यों करें? निम्नलिखित उदाहरण बता सकते हैं कि:

echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'

"फू" का उत्पादन करेगा।

हालाँकि,

echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'

विफल हो जाएगा क्योंकि अब sedपहले s/foo/barएक फ़ाइल नाम के रूप में व्याख्या करता है । इसलिए, भविष्य के लिए जीवन को आसान बनाने के लिए, आप पहले से ही -eआज ध्वज का उपयोग करना शुरू कर सकते हैं। इस तरह से भविष्य में आप केवल एक अतिरिक्त स्क्रिप्ट के साथ कमांड का उपयोग कर सकते हैं -e <script>

NB अन्य ;लिपियों का उपयोग करने के विकल्प के रूप में उपयोग करने वाले अन्य उत्तरों का सुझाव दिया गया है। जबकि कुछ मामलों में यह तकनीकी रूप से संभव है, इसे प्रोत्साहित नहीं किया जाता है, क्योंकि यह जल्दी से कोड पढ़ने के लिए बहुत कठिन हो जाता है। यहां एक उदाहरण देखें: https://www.grymoire.com/Unix/Sed.html#uh-61

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