किसी मेल लाइन के बाद से शुरू होने वाली फ़ाइल में सभी लाइनें कैसे हटाऊं?


84

मेरे पास एक फाइल है जो पाठ की कई पंक्तियों से बनी है:

The first line
The second line
The third line
The fourth line

मेरे पास एक स्ट्रिंग है जो लाइनों में से एक है: The second line

मैं फ़ाइल में इसके बाद स्ट्रिंग और सभी लाइनों को हटाना चाहता हूं, इसलिए यह स्ट्रिंग के अलावा The third lineऔर भी हटा देगा The fourth line। फ़ाइल बन जाएगी:

The first line

मैंने Google पर एक समाधान खोजा है, और ऐसा लगता है कि मुझे इसका उपयोग करना चाहिए sed। कुछ इस तरह:

sed 'linenum,$d' file

लेकिन स्ट्रिंग की लाइन नंबर कैसे पता करें? या, मुझे इसे कैसे करना चाहिए?


आपका समस्या कथन विरोधाभासी है: 'मैं लाइन के बाद सभी लाइनों को हटाना चाहता हूं ' का मतलब है कि आप सिर्फ दो लाइनें हटाएं (जैसा कि आप कहते हैं), लेकिन फिर आपका उदाहरण आउटपुट मैच लाइन को भी गायब दिखाता है। जो आप वास्तव में चाहते हैं?
जोनाथन लेफ़लर

मैचिंग लाइन और इसके बाद की सभी लाइनें। मुझे अपनी अंग्रेजी सुधारनी चाहिए। आपकी जानकारी के लिए धन्यवाद।
DocWiki

जवाबों:


136

यदि आप मिलान की गई लाइन (या किसी भी निम्न पंक्तियों) को प्रिंट नहीं करना चाहते हैं:

sed -n '/The second line/q;p' inputfile

यह कहता है "जब आप उस रेखा तक पहुंच जाते हैं जो पैटर्न से बाहर निकलने से मेल खाती है, अन्यथा प्रत्येक पंक्ति को प्रिंट करें"। -nविकल्प अंतर्निहित मुद्रण होने से बचाता है और pआदेश स्पष्ट लाइनों मुद्रित करने के लिए आवश्यक है।

या

sed '/The second line/,$d' inputfile

यह कहता है कि "मिलान की गई लाइन पर शुरू होने वाले आउटपुट से सभी लाइनों को हटा दें और फ़ाइल के अंत तक जारी रखें"।

लेकिन पहले वाला तेज है। हालाँकि, यह पूरी तरह से प्रसंस्करण छोड़ देगा यदि आपके पास तर्क के रूप में कई फाइलें हैं, तो पहली मिलान फ़ाइल के बाद वाले संसाधित नहीं होंगे। इस मामले में, डिलीट फॉर्म बेहतर है।

यदि आप मिलान की हुई रेखा को प्रिंट करना चाहते हैं, लेकिन निम्नलिखित पंक्तियों को नहीं:

sed '/The second line/q' inputfile

यह कहता है "सभी लाइनों को प्रिंट करें और जब मिलान लाइन तक पहुंच जाए तो छोड़ दें" ( -nविकल्प (कोई निहित प्रिंट नहीं) का उपयोग नहीं किया जाता है)।

अतिरिक्त जानकारी के लिए मैन सेड देखें ।


3
लेकिन कुछ कमांड टूटी हुई पाइप ( co -pउदाहरण के लिए आरसीएस ) के बारे में चींटियों को प्राप्त करते हैं, और फिर आप sed '/The second line/,$d'संकेतन के साथ बेहतर हैं ।
जोनाथन लेफ़लर

क्या आप कृपया स्पष्टीकरण जोड़ सकते हैं?
अहमद अब्देलघानी

@ अहमदअब्देलघनी: स्पष्टीकरण जोड़ा गया।
अगली सूचना तक रोक दिया गया।

@DennisWilliamson बहुत बहुत धन्यवाद।
अहमद अब्देलघानी

पहली विधि दो बार मिलान रेखा से पहले अंतिम पंक्ति का प्रिंट आउट लेती है। कार्य के pबाद हटाना ;
क्रेजीफ्राग

27

यह अन्य दिए गए समाधानों की तुलना में थोड़ा कम है। पूंजी क्यू का उपयोग करने से बाहर निकलने के लिए वर्तमान लाइन को प्रिंट करने से बचा जाता है।

 sed '/The second line/Q' file

वास्तव में लाइनों को हटाने के लिए आप एक ही वाक्यविन्यास का उपयोग कर सकते हैं।

 sed -i '/The second line/Q' file

1
यह अब तक मेरा पसंदीदा समाधान है।
ट्राइट्रीजैन

5
sed '/The second line/q0' file

या, ग्नू सेड के बिना:

sed '/The second line/q' file

या, grep का उपयोग कर:

grep -B 9999999 "The second line"

बहुत बहुत धन्यवाद! क्या आप मुझे बता सकते हैं कि मैं एक विशिष्ट स्ट्रिंग की लाइन संख्या कैसे पा सकता हूं, जो मुझे अभी तक नहीं पता है।
डॉकविकी

grep -n "दूसरी पंक्ति" फ़ाइल | awk -F: '{प्रिंट $ 1}'
एरिक

@DocWiki: आपको पंक्ति संख्या की आवश्यकता नहीं है; आप इसे खोजें। sed "/$string/,\$d" inputfile
जोनाथन लेफ्लर 2

5

Awk का उपयोग करना (मिलान रेखा नहीं दिखाना)

awk '/pattern/ {exit} {print}' file.txt

यह सबसे अच्छा उत्तर है, क्योंकि आप दूसरी पंक्ति का मूल्य नहीं जानते होंगे।
रॉनजॉन

0

सबसे पहले लाइन नंबर जोड़ें और लाइन हटाएं

cat new.txt 
The first line
The second line
The third line
The fourth line

 cat new.txt  | nl
     1  The first line
     2  The second line
     3  The third line
     4  The fourth line



cat new.txt  | nl | sed  "/2/d"
     1  The first line
     3  The third line
     4  The fourth line

cat new.txt  |  nl |sed  "3d;4d"
     1  The first line
     2  The second line

awk का उपयोग करना

awk 'NR!=3 && NR!=4' new.txt 
The first line
The second line

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.