मुझे sed
-e
स्विच के बारे में कोई दस्तावेज नहीं मिल सकता है , साधारण प्रतिस्थापन के लिए, क्या मुझे इसकी आवश्यकता है?
जैसे
sed 's/foo/bar/'
वी.एस.
sed -e 's/foo/bar/'
मुझे sed
-e
स्विच के बारे में कोई दस्तावेज नहीं मिल सकता है , साधारण प्रतिस्थापन के लिए, क्या मुझे इसकी आवश्यकता है?
जैसे
sed 's/foo/bar/'
वी.एस.
sed -e 's/foo/bar/'
जवाबों:
मैन पेज से:
-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
।
-e
यह आपके लिए काम कर सकता है:
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
-e
साथ-साथ लेबल और ब्रांच कमांड को भी नए सिरे से इस्तेमाल करने की जरूरत है । यह काम नहीं करेगा sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm"
:। लेकिन यह होगा:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
must be terminated with a newline
यहां वाक्यांश का मतलब कितना आवश्यक है । जब मैंने यहाँ अपने में परीक्षण किया cygwin
, तो यह काम करता है sed '/foo/i\bar' file
:। इसलिए अब जब हम अलग-अलग भावों को एक साथ जोड़ सकते हैं, तो यह फिर से मूल प्रश्न पर उठता है: इसका असली उद्देश्य क्या है -e
?
मदद के लिए 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
man sed
?