भाग 1
बस d
13 वीं पंक्ति को elete करें:
sed '13d' <file.txt
और ऊपर का पूरक करने का एक सामान्य तरीका है:
sed '13!d' <file.txt
भाग 2
क्योंकि यह किया जा सकता है:
sed -n ':a;${P;q};N;4,$D;ba' <file.txt
ध्यान दें कि 4
आपके द्वारा आवश्यक संख्या से एक अधिक है। इसलिए यदि आप अंतिम -10 वीं पंक्ति चाहते हैं, तो यह होगा 11
।
के साथ परीक्षण seq
:
$ seq 100 | sed -n ':a;${P;q};N;4,$D;ba'
98
$
समझाने का प्रयास किया
:a # define label a
${ # match the last line
P # print the first line of the pattern space
q # quit
}
N # match all lines: append the next line to the pattern
4,${ # match the range of lines 4 to the end of the file
D # delete the first line of the pattern space
}
ba # match all lines: jump back to label a
ग्लेन जैकमैन का मूल्यवान जोड़:
वह "केवल Nth लाइन" थी। यहाँ "सभी BUT द Nth लाइन" है:
sed -n ':a;${s/^[^\n]*\n//;p;q};N;4,${P;D};ba'
GNU sed के साथ काम करता है, \n
अनुक्रम अन्य sed के साथ काम नहीं कर सकता है।
मैंने BSD sed (OSX) के साथ यह कोशिश की और पाया कि यह ऊपर के रूप में काफी काम नहीं आया। मुद्दे दिखाई देते हैं:
;
आम तौर पर काम करने के लिए अलग-अलग लाइनों का उपयोग किया जाता है, लेकिन एक लेबल के बाद काम नहीं करता है
- BSD sed को
;
एक-लाइन {}
कमांड समूह में अंतिम कमांड के बाद की आवश्यकता प्रतीत होती है , जबकि GNU sed नहीं करता है
\n
आम तौर पर नियमित अभिव्यक्ति के भीतर इस्तेमाल किया जा सकता है, लेकिन स्पष्ट रूप से एक []
ब्रैकेट अभिव्यक्ति के भीतर नहीं । इसलिए नई कहानियों को बाहर करने के लिए, हम [[:alnum:][:punct:][:graph:][:blank:]]
इसके बजाय कुछ का उपयोग कर सकते हैं , हालांकि यह अन्य वर्णों (विशेष रूप से अन्य नियंत्रण वर्ण) को बाहर कर सकता है।
तो यह एक अधिक मंच स्वतंत्र संस्करण में एक प्रयास है:
sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'
यह OSX और Ubuntu के तहत काम करता है।
head
/tail
समाधान बहुत धीमी एक से हैsed
समाधान। हालांकि धन्यवाद।