जवाबों:
के साथ sed
, जैसे:
sed '20,37d; 45d' < input.txt > output.txt
यदि आप इन-प्लेस में ऐसा करना चाहते हैं:
sed --in-place '20,37d; 45d' file.txt
This option specifies that files are to be edited in-place. GNU
'sed अस्थायी फ़ाइल बनाने करके करता है और मानक आउटपुट के बजाय इस फ़ाइल को आउटपुट भेज रहा है। `... मुझे किसी अन्य 'sed' के बारे में नहीं पता है, लेकिन एक स्ट्रीम एडिटर के साथ" अपडेट "करने का लॉजिस्टिक्स " कंप्यूट "नहीं है :)
यदि फ़ाइल मेमोरी में आराम से फिट होती है, तो आप भी उपयोग कर सकते हैं ed
।
कमांड sed
एक उल्लेखनीय अंतर के साथ ऊपर के समान हैं : आपको अवरोही क्रम में हटाए जाने वाले लाइन नंबर / रेंज की सूची को पास करना होगा (उच्चतम लाइन नो / रेंज से निम्नतम एक तक)। कारण यह है कि जब आप लाइनों को हटाते हैं / सम्मिलित / विभाजित / जोड़ते हैं ed
, तो पाठ बफर को प्रत्येक उपकमांड के बाद अपडेट किया जाता है, इसलिए यदि आप कुछ लाइनें हटाते हैं, तो शेष पंक्तियाँ अब बफर में उसी स्थिति में नहीं रहेंगी जब अगले सबकोमांड को निष्पादित किया जाता है। तो आपको 1 पीछे की ओर शुरू करना होगा ।
इन-प्लेस संपादन:
ed -s in_file <<IN
45d
20,37d
w
q
IN
या
ed -s in_file <<< $'45d\n20,37d\nw\nq\n'
या
printf '%s\n' 45d 20,37d w q | ed -s in_file
यदि आप फ़ाइल को लिखने के बजाय परिणामी आउटपुट को प्रिंट करना चाहते हैं, तो रिंट w
को ,p
रिंट से बदलें । यदि आप मूल फ़ाइल को अक्षुण्ण रखना चाहते हैं और किसी अन्य फ़ाइल को लिखना चाहते हैं तो आप नई फ़ाइल का नाम w
संस्कार उपकमांड पास कर सकते हैं :
ed -s in_file <<IN
78,86d
65d
51d
20,37d
w out_file
q
IN
1
जब तक आप प्रत्येक d
ईटेल के बाद नई लाइन नंबरों की गणना करने के लिए तैयार नहीं होते हैं , जो इस विशेष मामले के लिए काफी तुच्छ है (लाइनों को 20-37 हटाने के बाद, यानी 18 लाइनें, लाइन 45 लाइन 27 हो जाती है) ताकि आप चला सकें:
ed -s in_file <<IN
20,37d
27d
w
q
IN
हालाँकि, यदि आपको कई लाइन नंबर / रेंज को हटाना है, तो पीछे की ओर काम करना एक बिना दिमाग वाला है।
q
कमांड अंत में उपयोगी है? मुझे लगता है कि यह किसी भी तरह से बाहर निकलता है।
बस इसे मेमोरी में पढ़ें, इसे बदल दें, फिर इसे वापस लिखें। आप कुछ ऐसा कर सकते हैं
filename = "foo"
f = open(filename, 'r+')
linenums = [1, 3]
s = [y for x, y in enumerate(f) if x not in [line-1 for line in linenums]]
f.seek(0)
f.write(''.join(s))
f.truncate(f.tell())
f.close()
5 लाइन फ़ाइल के साथ परीक्षण किया गया। Http://pleac.sourceforge.net/pleac_python/fileaccess.html पर क्रेडिट , "एक फ़ाइल को बिना अस्थायी फ़ाइल के स्थान में संशोधित करना" अनुभाग देखें। Https://stackoverflow.com/questions/125703/how-do-i-modify-a-text-file-in-python भी देखें
कुछ नोट:
कोई पहले फ़ाइल को छोटा कर सकता है, फिर उसे लिख सकता है, बजाय लिखने के लिए, फिर ऊपर की तरह छोटा कर सकता है। हालाँकि, मैं एक पायथन ध्वज के बारे में नहीं जानता, जो किसी को पढ़ने की अनुमति देता है, और फिर एक काट-छाँट लिखता है। लेकिन शायद मुझे कुछ याद आ रहा है, क्योंकि दस्तावेज़ स्पष्ट नहीं है। जो मुझे लाता है
कभी-कभी अजगर डॉक्स वास्तव में चूसते हैं। Http://docs.python.org/library/functions.html#open देखें
मोड 'r +', 'w +' और 'a' अपडेट करने के लिए फ़ाइल खोलें (ध्यान दें कि 'w +' फ़ाइल को काटती है)।
क्या इससे आपको कोई मतलब है? "अद्यतन करने के लिए खुला" क्या है?
मुझे नहीं पता कि अजगर में ऐसा करने से धारा के संपादक की तरह कुछ यूनिक्स का विरोध बेहतर है। यह अधिक पोर्टेबल हो सकता है, लेकिन मुझे नहीं पता कि पोर्टेबल सेड कैसा है। मैंने इसे सिर्फ इस तरह लिखा है क्योंकि मैं क्लासिक यूनिक्स टूल्स का उपयोग करने की तुलना में निम्न स्तर की प्रोग्रामिंग के साथ अधिक सहज हूं, जो कि यदि आप चाहते हैं तो वे ठीक करते हैं, लेकिन मुझे लगता है कि आम तौर पर कम लचीले होते हैं।
यह दृष्टिकोण (फ़ाइल को मेमोरी में हेरफेर) डिस्क स्थान के लिए मेमोरी को ट्रेड करता है। यह कुछ सौ एमबी तक की फाइलों के लिए कुछ जीबी मेमोरी वाले मशीनों पर ओके काम करना चाहिए। पायथन बहुत कुशलता से तारों को संभालता नहीं है, इसलिए उदाहरण के लिए C / C ++ पर स्विच करना प्रदर्शन को थोड़ा बढ़ाएगा और मेमोरी के उपयोग को बहुत कम कर देगा।
आप पूर्व मोड में विम का उपयोग कर सकते हैं:
ex -sc '20,37d|45d|x' file
d
हटाना
x
सहेजें और बंद करें