एक बड़ी पाठ फ़ाइल में एकाधिक खोज और कार्यों को प्रतिस्थापित करना


11

मेरे पास एक बड़ी पाठ फ़ाइल है (लगभग 2GB)। मैं एक ही फ़ाइल पर पांच खोज करना और क्रियाओं को बदलना चाहता हूं, और एक कमांड में ऐसा करना चाहता हूं। आम तौर पर मैं विम का उपयोग करता हूं, फ़ाइल को खोलता हूं, एक को बदले की कार्रवाई करता हूं, फिर अगला, आदि। एक पकड़ है, जैसा कि मैंने देखा कि तीन या चार खोजों के बाद मेमोरी मुद्दों के कारण विम दुर्घटनाएं होती हैं।

यहाँ Vim में प्रयुक्त कमांड के दो उदाहरण दिए गए हैं:

:%s/www\.abcdef/www.test.abcdef/g 
:%s/www\.klmnop/www.test.klmnop/g

इसे संभालने का सबसे अच्छा तरीका क्या है?

जवाबों:


8

मैं इस तरह से sed का उपयोग करूंगा:

sed -i "s/www\.abcdef/www.test.abcdef/g;s/www\.kmlnop/www.test.klmnop/g;" yourfile.txt

-iविकल्प "जगह में" प्रतिस्थापन के लिए खड़ा है। आप इस विकल्प को एक्सटेंशन प्रदान करते हुए अपनी फ़ाइल का बैकअप बनाने के लिए sed को बता सकते हैं ( -i.bakyourfile.txt को आपकेfile.txt.bak के रूप में बैकअप देगा)।


यह जल्दी है! न केवल आपका उत्तर ;-), लेकिन 5 खोज और प्रतिकृतियों वाली यह स्क्रिप्ट लगभग 10x तेज़ है जैसे फ़ाइल को केवल vim में खोलना। हालांकि एक बात ने मुझे उलझन में डाल दिया। पहले मैंने सोचा था कि .bak फ़ाइल संपादित फ़ाइल होगी, लेकिन यह निश्चित रूप से मूल है।
SPRBRN

एक बार में 2GB फ़ाइल में दस खोज और बदलें (हजारों हिट के साथ), कोई मेमोरी समस्या नहीं। एक औसत डेस्कटॉप पर दो मिनट से कम - सुपर!
SPRBRN

एक प्रश्न ... आप प्रतिस्थापित स्ट्रिंग में डॉट्स से बच जाते हैं। क्या यह आवश्यक है?
SPRBRN

1
आपका स्वागत है @rxt :) वास्तव में, आप सही हैं, आप प्रतिस्थापन स्ट्रिंग में गैर-बच गए डॉट्स का उपयोग कर सकते हैं sed। मैंने कोशिश की, और यह काम करता है। Unix & Linux Stackexchange में एक अच्छा थ्रेड है , और स्वीकृत उत्तर में डॉट्स का उल्लेख नहीं है जैसे कि बचने के लिए वर्ण।
ssssteffff

2
@ आपने कहा कि स्ट्रिंग को बदलें , क्षमा करें, नहीं, आपको उन्हें वहां से भागने की आवश्यकता नहीं है।
टेराडॉन

6

यदि आपके पास कई और खोज पैटर्न हैं, तो आप उन्हें एक फ़ाइल में सहेज सकते हैं और वहां से प्रतिस्थापन को पढ़ सकते हैं। उदाहरण के लिए, ये कहें कि ये निम्नलिखित हैं replacements.txt:

www\.abcdef www.test.abcdef 
www\.klmnop www.test.klmnop

फिर आप एन प्रतिस्थापनों की एक सूची पढ़ सकते हैं और उन्हें इसके साथ बदल सकते हैं:

while read from to; do
  sed -i "s/$from/$to/" infile.txt ; 
done < replacements.txt 

टिप्पणियाँ:

  • यह मानता है कि आपके खोज स्ट्रिंग में रिक्त स्थान नहीं हैं और किसी भी अजीब वर्ण को अंदर भागने की आवश्यकता है replacements.txt
  • यह sedप्रति प्रतिस्थापन एक चलाएगा जो आपके कई प्रतिस्थापन ऑपरेशन होने में थोड़ी देर लग सकता है।
  • यह मनमाने ढंग से प्रतिस्थापन (हजारों या लाखों या जो कुछ भी) के साथ सौदा कर सकता है, जब तक कि आपको कोई आपत्ति नहीं है कि इसमें थोड़ा अधिक समय लगेगा।

एक अन्य विकल्प उपरोक्त को sedस्क्रिप्ट के रूप में लिखना होगा :

s/www\.abcdef/www\.test\.abcdef/g;
s/www\.kmlnop/www\.test\.klmnop/g;
s/aaaa/bbbb/g;
s/cccc/dddd/g;
s/eeee/ffff/g;

फिर आप अपनी फ़ाइल पर स्क्रिप्ट चला सकते हैं और यह एक ही बार में सभी प्रतिस्थापन कर देगा:

sed -f replace.sed infile.txt 

+1 के लिए, अन्य विकल्प ''। एक फ़ाइल में संग्रहित प्रतिस्थापन के लिए आसान हो सकता है! (मुझे उम्मीद है कि मुझे वह याद होगा ...)
mpy

+1 "अन्य विकल्प" के लिए भी क्योंकि यह कस्टम स्क्रिप्ट के बजाय देशी कार्यक्षमता का उपयोग करता है, इसलिए अधिक पोर्टेबल / साझा करने योग्य है
डेविड कुक

@DavidCook धन्यवाद, लेकिन यह अन्य की तुलना में अधिक देशी या पोर्टेबल नहीं है। पहला दृष्टिकोण POSIX शेल लूप का उपयोग कर रहा है, यह बिल्कुल दूसरे की तरह ही पोर्टेबल है। यह सिर्फ इतना धीमा होगा क्योंकि यह एक शेल लूप का उपयोग करता है।
टेराडो

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