मैं एक या एक से अधिक विशिष्ट पंक्ति संख्याओं को फ़ाइल से हटाना चाहता हूं। मैं इसे सेड का उपयोग कैसे करूँगा?
मैं एक या एक से अधिक विशिष्ट पंक्ति संख्याओं को फ़ाइल से हटाना चाहता हूं। मैं इसे सेड का उपयोग कैसे करूँगा?
जवाबों:
यदि आप लाइनों को 10 और 12 के माध्यम से हटाना चाहते हैं:
sed -e '5,10d;12d' file
यह स्क्रीन पर परिणाम प्रिंट करेगा। यदि आप परिणाम को उसी फ़ाइल में सहेजना चाहते हैं:
sed -i.bak -e '5,10d;12d' file
यह फ़ाइल को वापस कर देगा file.bak
, और दी गई लाइनों को हटा देगा।
नोट: लाइन नंबर 1 से शुरू होते हैं। फ़ाइल की पहली पंक्ति 1 है, 0 नहीं।
sed -e '5,$d' file
sed -e '5d' file
। वाक्य रचना है <address><command>
; जहाँ <address>
या तो एक लाइन हो सकती है जैसे 5
या लाइनों की एक श्रृंखला 5,10
, और कमांड d
दी गई लाइन या लाइनों को हटा देती है। पते भी नियमित अभिव्यक्ति हो सकते हैं, या डॉलर चिह्न $
फ़ाइल की अंतिम पंक्ति को दर्शाता है।
आप किसी विशेष सिंगल लाइन को उसके लाइन नंबर से हटा सकते हैं
sed -i '33d' file
यह 33 लाइन नंबर पर लाइन को हटा देगा और अपडेट की गई फ़ाइल को बचाएगा।
sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'
। धन्यवाद!
और साथ ही जाग
awk 'NR!~/^(5|10|25)$/' file
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$
यह अक्सर एक एंटीपेटर्न का लक्षण होता है। जिस टूल ने लाइन नंबरों का निर्माण किया है, उसे अच्छी तरह से बदल दिया जा सकता है, जो लाइनों को तुरंत हटा देता है। उदाहरण के लिए;
grep -nh error logfile | cut -d: -f1 | deletelines logfile
(जहां deletelines
आप जिस उपयोगिता की कल्पना कर रहे हैं, उसकी जरूरत है) वैसी ही है
grep -v error logfile
यह कहते हुए कि, यदि आप ऐसी स्थिति में हैं, जहाँ आपको वास्तव में इस कार्य को करने की आवश्यकता है, तो आप sed
लाइन नंबरों की फाइल से एक सरल स्क्रिप्ट तैयार कर सकते हैं । विनोदी (लेकिन शायद थोड़ा भ्रमित) आप इसके साथ कर सकते हैं sed
।
sed 's%$%d%' linenumbers
यह लाइन नंबरों की एक फाइल को स्वीकार करता है, एक प्रति पंक्ति, और मानक आउटपुट पर, d
प्रत्येक के बाद एपेंडेड के साथ एक ही लाइन नंबर का उत्पादन करता है । यह एक मान्य sed
स्क्रिप्ट है, जिसे हम किसी फ़ाइल, या (कुछ प्लेटफार्मों पर) पाइप से दूसरे sed
उदाहरण में सहेज सकते हैं :
sed 's%$%d%' linenumbers | sed -f - logfile
कुछ प्लेटफार्मों पर, sed -f
विकल्प तर्क समझ में नहीं करता है -
मतलब मानक इनपुट करने के लिए है, तो आप एक अस्थायी फ़ाइल के लिए स्क्रिप्ट अनुप्रेषित करने के लिए है, और यह साफ है जब आप पूरा कर लें, या हो सकता है के साथ अकेला डैश की जगह /dev/stdin
या /proc/$pid/fd/1
अपने OS (या खोल अगर ) के पास है।
हमेशा की तरह, आप मानक आउटपुट पर परिणाम का उत्पादन करने के बजाय, लक्ष्य फ़ाइल को संपादित करने -i
के -f
विकल्प से पहले जोड़ सकते हैं sed
। * BSDish प्लेटफार्मों (OSX सहित) पर आपको एक स्पष्ट तर्क की आपूर्ति करने की आवश्यकता है -i
; एक सामान्य मुहावरा एक खाली तर्क की आपूर्ति करना है; -i ''
।
p
करने के बजाय d
, विकल्प के साथ -n
(यह बिना काम नहीं करेगा -n
, और !d
या तो काम नहीं करेगा)।
मैं जाग के साथ एक सामान्यीकरण का प्रस्ताव करना चाहूंगा।
जब फ़ाइल एक निश्चित आकार के ब्लॉक द्वारा बनाई जाती है और हटाने के लिए लाइनें प्रत्येक ब्लॉक के लिए दोहराई जाती हैं, तो इस तरह से काम करना ठीक हो सकता है
awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print $0}'
OriginFile.dat > MyOutputCuttedFile.dat
इस उदाहरण में ब्लॉक के लिए आकार 2000 है और मैं लाइनों को प्रिंट करना चाहता हूं [1..713] और [1026..1029]।
NR
वर्तमान लाइन संख्या को संग्रहीत करने के लिए awk द्वारा उपयोग किया जाने वाला चर है।%
दो पूर्णांकों के विभाजन का शेष (या मापांक) देता है;nl=((NR-1)%BLOCKSIZE)+1
यहां हम वेरिएबल nl में वर्तमान ब्लॉक के अंदर लाइन नंबर लिखते हैं । (निचे देखो)||
और &&
तार्किक ऑपरेटर हैं OR और AND हैं ।print $0
पूरी लाइन लिखता हैWhy ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
+1 We add again 1 because we want to restore the desired order.
+-----+------+----------+------------+
| NR | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
| 1 | 1 | 0 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 0 | 2 | 3 |
| 4 | 1 | 0 | 1 |
+-----+------+----------+------------+