कैसे मैं सभी लेकिन Nth को अंतिम पंक्ति में sed में प्रिंट करूं?


9
  • मैं पूरक / "विपरीत" करना चाहता हूं

    sed 13q;d <file.txt
    

    अधिक आम तौर पर, क्या इस तरह के पूरक / उलटा / विपरीत में करना संभव है sed? या केवल रेगेक्स के लिए?

  • मैं तीसरी-से-अंतिम पंक्ति को कैसे प्रिंट करूं? क्या इसके लिए दो tacऔर गिनती में आगे की आवश्यकता है sed? या फिर sedखुद को पीछे से गिनने का कोई तरीका है ?

जवाबों:


12

भाग 1

बस d13 वीं पंक्ति को 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) के साथ यह कोशिश की और पाया कि यह ऊपर के रूप में काफी काम नहीं आया। मुद्दे दिखाई देते हैं:

  1. ; आम तौर पर काम करने के लिए अलग-अलग लाइनों का उपयोग किया जाता है, लेकिन एक लेबल के बाद काम नहीं करता है
  2. BSD sed को ;एक-लाइन {}कमांड समूह में अंतिम कमांड के बाद की आवश्यकता प्रतीत होती है , जबकि GNU sed नहीं करता है
  3. \nआम तौर पर नियमित अभिव्यक्ति के भीतर इस्तेमाल किया जा सकता है, लेकिन स्पष्ट रूप से एक []ब्रैकेट अभिव्यक्ति के भीतर नहीं । इसलिए नई कहानियों को बाहर करने के लिए, हम [[:alnum:][:punct:][:graph:][:blank:]]इसके बजाय कुछ का उपयोग कर सकते हैं , हालांकि यह अन्य वर्णों (विशेष रूप से अन्य नियंत्रण वर्ण) को बाहर कर सकता है।

तो यह एक अधिक मंच स्वतंत्र संस्करण में एक प्रयास है:

sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'

यह OSX और Ubuntu के तहत काम करता है।


@jimmij एसई नेटवर्क में संबंधित प्रश्नों के बारे में अन्य उत्तर सुझाव है कि एक head/ tailसमाधान बहुत धीमी एक से है sedसमाधान। हालांकि धन्यवाद।
isomorphismes

3
@isomorphismes कोई प्रोग्राम किसी फ़ाइल में लाइनों की संख्या को तब तक नहीं जान सकता जब तक कि वह पूरी फ़ाइल के माध्यम से नहीं जाती। उसके आसपास कोई रास्ता नहीं है। नीचे से गिनती करने का एकमात्र तरीका फ़ाइल को उल्टा करना और ऊपर से गिनती करना या दो बार पार्स करना है। इसलिए सिर / पूँछ बहुत तेज़ हो जाती है जितना जल्दी हो जाता है।
terdon

@isomorphismes ... क्योंकि वे ( head/ tail) जो करते हैं, उसके लिए अनुकूलित होते हैं।
पेट्रफ

@isomorphismes - आपके लिए आवश्यक सभी भागों के साथ संपादित
डिजिटल ट्रामा

अच्छा! मुझे अपना जवाब बदलना पड़ा, क्योंकि मैंने किसी तरह इसकी उम्मीद की थी कि यह अधिक जटिल हो। :)
पेट्रॉफ़ सिप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.