निम्नलिखित TERMINATE
फ़ाइल के अंत तक मेल खाते हुए लाइन को प्रिंट करेगा :
sed -n -e '/TERMINATE/,$p'
समझाया: उस पर अपनी स्क्रिप्ट निष्पादित करने के बाद प्रत्येक पंक्ति को प्रिंट करने के -n
डिफ़ॉल्ट व्यवहार को अक्षम करता sed
है, -e
एक स्क्रिप्ट को इंगित किया है sed
, /TERMINATE/,$
एक पता (लाइन) रेंज चयन है जिसका अर्थ TERMINATE
है कि फ़ाइल के अंत में नियमित अभिव्यक्ति (जैसे grep) से मेल खाता पहली पंक्ति ( $
) , और p
प्रिंट कमांड है जो वर्तमान लाइन को प्रिंट करता है।
यह उस लाइन से प्रिंट होगा TERMINATE
जो फ़ाइल के अंत तक मेल खाने वाली लाइन का अनुसरण करती है :
(मिलान लाइन से EOF तक, मिलान लाइन सहित नहीं)
sed -e '1,/TERMINATE/d'
समझाया गया: 1,/TERMINATE/
एक पता (लाइन) श्रेणी चयन है जिसका अर्थ है कि पहली पंक्ति में इनपुट के लिए पहली पंक्ति TERMINATE
नियमित अभिव्यक्ति से मेल खाती है , और d
डिलीट कमांड है जो वर्तमान लाइन को हटा देती है और अगली लाइन पर छोड़ देती है। जैसा कि sed
डिफ़ॉल्ट व्यवहार लाइनों को प्रिंट करना है, यह TERMINATE
इनपुट के अंत के बाद लाइनों को प्रिंट करेगा ।
संपादित करें:
यदि आप पहले लाइनें चाहते हैं TERMINATE
:
sed -e '/TERMINATE/,$d'
और यदि आप TERMINATE
एक ही पास में 2 अलग-अलग फ़ाइलों में पहले और बाद में दोनों लाइनें चाहते हैं:
sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file
फ़ाइलों के पहले और बाद में समाप्ति के साथ पंक्ति होगी, इसलिए प्रत्येक को संसाधित करने के लिए आपको उपयोग करने की आवश्यकता है:
head -n -1 before
tail -n +2 after
EDIT2:
यदि आप सीड स्क्रिप्ट में फ़ाइलनाम को हार्ड-कोड नहीं करना चाहते हैं, तो आप कर सकते हैं:
before=before.txt
after=after.txt
sed -e "1,/TERMINATE/w $before
/TERMINATE/,\$w $after" file
लेकिन फिर आपको $
अंतिम पंक्ति से अर्थ से बचना होगा ताकि शेल $w
चर का विस्तार करने की कोशिश नहीं करेगा (ध्यान दें कि अब हम सिंगल कोट्स के बजाय स्क्रिप्ट के चारों ओर दोहरे उद्धरण चिह्नों का उपयोग करते हैं)।
मैं यह बताना भूल गया कि स्क्रिप्ट में फ़ाइल नाम के बाद नई लाइन महत्वपूर्ण है ताकि सेड को पता चले कि फाइलनेम समाप्त हो गए हैं।
संपादित करें: २०१६-०५३०
Sébastien Clément ने पूछा: "आप TERMINATE
एक चर द्वारा हार्डकोड को कैसे प्रतिस्थापित करेंगे ?"
आप मिलान पाठ के लिए एक चर बनायेंगे और फिर इसे पिछले उदाहरण की तरह ही करेंगे:
matchtext=TERMINATE
before=before.txt
after=after.txt
sed -e "1,/$matchtext/w $before
/$matchtext/,\$w $after" file
पिछले उदाहरण के साथ मिलान पाठ के लिए एक चर का उपयोग करने के लिए:
## Print the line containing the matching text, till the end of the file:
## (from the matching line to EOF, including the matching line)
matchtext=TERMINATE
sed -n -e "/$matchtext/,\$p"
## Print from the line that follows the line containing the
## matching text, till the end of the file:
## (from AFTER the matching line to EOF, NOT including the matching line)
matchtext=TERMINATE
sed -e "1,/$matchtext/d"
## Print all the lines before the line containing the matching text:
## (from line-1 to BEFORE the matching line, NOT including the matching line)
matchtext=TERMINATE
sed -e "/$matchtext/,\$d"
इन मामलों में चर के साथ पाठ की जगह के बारे में महत्वपूर्ण बिंदु हैं:
- [ ] [ ]]
$variablename
में संलग्न चर ( ) का विस्तार नहीं होगा लेकिन [ ] के भीतर चर । इसलिए, आपको उन सभी को बदलना होगा यदि उनमें पाठ है जिसे आप एक चर के साथ बदलना चाहते हैं। single quotes
'
double quotes
"
single quotes
double quotes
sed
पर्वतमाला भी एक होते हैं $
और तुरंत की तरह एक पत्र के द्वारा पीछा कर रहे हैं: $p
, $d
, $w
। उन्होंने यह भी चर की तरह दिखाई देगा विस्तार करने की है, तो आप उन से बचने के लिए है $
एक बैकस्लैश [साथ पात्रों \
] की तरह: \$p
, \$d
, \$w
।
grep 'TERMINATE' file