यह एक पुराना प्रश्न है, लेकिन यहां कोई भी उत्तर s/from/to/
बहुत विस्तार से अन्य कार्यों पर चर्चा नहीं करता है।
sed
कथन का सामान्य रूप है
*address* *action*
जहां पता रेगेक्स रेंज या लाइन नंबर रेंज (या खाली हो सकता है, जिस स्थिति में कार्रवाई हर इनपुट लाइन पर लागू होती है) हो सकती है। इसलिए उदाहरण के लिए
sed '1,4d' file
4 के माध्यम से लाइनों 1 नष्ट करेगा ( पता लाइन नंबर रेंज है 1,4
और कार्रवाई है d
हटाएँ आदेश); तथा
sed '/ick/,$s/foo/bar/' file
की पहली आवृत्ति का स्थान ले लेगा foo
साथ bar
regex पर पहला मैच के बीच किसी भी लाइन पर ick
और फ़ाइल के अंत ( पता रेंज है /ick/,$
और कार्रवाई है s
स्थानापन्न आदेश s/foo/bar/
)।
इस संदर्भ में, यदि ick
आप एक चर से आते हैं , तो आप कर सकते हैं
sed "/$variable/,\$s/foo/bar/"
(सिंगल के बजाय डबल कोट्स के उपयोग पर ध्यान दें, ताकि शेल वैरिएबल को इंटरपोल कर सके, और शाब्दिक डॉलर के चिन्ह को डबल कोट्स के अंदर कोट करने की आवश्यकता हो) लेकिन अगर वेरिएबल में स्लैश है, तो आपको सिंटैक्स त्रुटि मिलेगी। (शेल चर का विस्तार करता है, फिर परिणामी स्ट्रिंग को पास करता है sed
; इसलिए sed
केवल शाब्दिक पाठ देखता है - इसमें शेल के चर की कोई अवधारणा नहीं है।)
इलाज के लिए एक अलग सीमांकक का उपयोग करना होता है (जहां स्पष्ट रूप से आपको एक वर्ण का उपयोग करने में सक्षम होना चाहिए जो चर के मूल्य में नहीं हो सकता है), लेकिन s%foo%bar%
मामले के विपरीत , आपको परिसीमा से पहले एक बैकस्लैश की भी आवश्यकता है यदि आप एक अलग का उपयोग करना चाहते हैं डिफ़ॉल्ट की तुलना में सीमांकक /
:
sed "\\%$variable%,\$s/foo/bar/" file
(एकल उद्धरण के अंदर, एक एकल बैकस्लैश स्पष्ट रूप से पर्याप्त होगा); या आप अलग से मूल्य में हर स्लैश से बच सकते हैं। यह विशेष वाक्य विन्यास केवल बैश है:
sed "/${variable//\//\\/}/,\$s/foo/bar/" file
या यदि आप एक अलग शेल का उपयोग करते हैं, तो प्रयास करें
escaped=$(echo "$variable" | sed 's%/%\\/%g')
sed "s/$escaped/,\$s/foo/bar/" file
स्पष्टता के लिए, यदि $variable
स्ट्रिंग समाहित है 1/2
तो उपरोक्त आदेशों के बराबर होगा
sed '\%1/2%,$s/foo/bar/' file
पहले मामले में, और
sed '/1\/2/,$s/foo/bar/' file
क्षण में।