यह गाइड आपको दिखाएगी कि Linux का उपयोग करते समय फ़ाइलों और डायरेक्टरी में शब्दों, स्ट्रिंग्स या वाक्यांशों को कैसे ढूंढें और बदलें।
जब आप Linux कमांड लाइन पर काम कर रहे होते हैं और आपको एक बड़ी फ़ाइल या बड़ी संख्या में फ़ाइलें मिलती हैं जिनमें आपको किसी विशेष टेक्स्ट को दूसरे से बदलने की आवश्यकता होती है, तो टेक्स्ट के प्रत्येक उदाहरण को ढूंढना और उस पर पेस्ट करना थोड़ा समय लेने वाला हो सकता है। खैर, चिंता न करें। Linux के पास आपके लिए बस समाधान है। यहां एक या अधिक फ़ाइलों में टेक्स्ट की स्ट्रिंग को स्वचालित रूप से ढूंढने और बदलने का तरीका बताया गया है।
इस अभ्यास के उद्देश्य के लिए हम "sed" नामक Linux कमांड लाइन टूल का उपयोग करेंगे। "sed" एक बहुत शक्तिशाली और बहुमुखी टूल है, और इसकी क्षमताओं के बारे में बहुत कुछ लिखा जा सकता है। हम यहां "sed" के एक बहुत सीमित पहलू का उपयोग कर रहे हैं। यदि आप इसके इस पहलू को दिलचस्प पाते हैं तो मैं निश्चित रूप से सलाह दूंगा कि आप "sed" पर थोड़ा और पढ़ें।
हम फ़ाइल में टेक्स्ट की स्ट्रिंग को ढूंढने और बदलने के लिए निम्न सिंटैक्स का उपयोग करने जा रहे हैं:
# sed -i 's/[orginal_text]/[new_text]/' filename.txt
मान लें कि आपके पास "database.txt" नामक फ़ाइल है जिसमें आपके डेटाबेस सर्वर के IP पते के कई उदाहरण हैं। आपने अभी एक नए डेटाबेस सर्वर पर स्विच किया है और इसे नए सर्वर के IP पते से अपडेट करने की आवश्यकता है। पुराना IP पता 192.168.1.16 है और नया 192.168.1.22 है। यहां बताया गया है कि आप इसके बारे में कैसे जाते हैं:
# cat database.txt
LOCAL_DATABASE = 192.168.1.16
LOCAL_DIR = /home/calvin/
PROD_DB = 192.168.1.16
# sed -i 's/192.168.1.16/192.168.1.22/g' database.txt
# cat database.txt
LOCAL_DATABASE = 192.168.1.22
LOCAL_DIR = /home/calvin/
PROD_DB = 192.168.1.22
अब फ़ाइल "database.inc" खोलें और जांचें कि नए IP पते ने आपके पुराने की जगह ले ली है या नहीं। उपरोक्त कमांड का विवरण यहां दिया गया है। पहले आप "sed" कमांड को कॉल करते हैं। फिर आप इसे पैरामीटर "-s" पास करते हैं जो "in place of" के लिए खड़ा है। अब हम अगले बिट के लिए नियमित अभिव्यक्तियों का थोड़ा सा उपयोग करते हैं, जिसे आमतौर पर "regex" के रूप में जाना जाता है। उद्धृत स्ट्रिंग में "s" "substitute" के लिए खड़ा है, और अंत में "g" "global" के लिए खड़ा है। उनके बीच वे उस टेक्स्ट स्ट्रिंग के "वैश्विक प्रतिस्थापन" का परिणाम देते हैं जिसे आप उनके बीच रखते हैं।
आप वैकल्पिक रूप से अंत में "g" को छोड़ सकते हैं। इसका मतलब है कि प्रतिस्थापन वैश्विक नहीं होगा, जो व्यावहारिक रूप से एक लाइन में स्ट्रिंग के केवल पहले उदाहरण के प्रतिस्थापन में तब्दील होता है। इसलिए यदि आपके पास उस टेक्स्ट के कई उदाहरणों वाली लाइन थी जिसे आप बदलने का प्रयास कर रहे हैं, तो यहां क्या होगा
# cat database.txt
LOCAL_DATABASE = 192.168.1.16
LOCAL_DIR = /home/calvin/
PROD_DB = 192.168.1.16, 192.168.1.16
# sed -i 's/192.168.1.16/192.168.1.22/' database.txt
# cat database.txt
LOCAL_DATABASE = 192.168.1.22
LOCAL_DIR = /home/calvin/
PROD_DB = 192.168.1.22, 192.168.1.16
यहां असली जादू आता है। अब, मान लें कि आप टेक्स्ट की स्ट्रिंग को न केवल एक फ़ाइल में, बल्कि पूरी डायरेक्टरी में बदलना चाहते हैं जिसमें आप हैं। कई टेक्स्ट फ़ाइलें हैं जिनमें आपको "wine" को "champagne" से ढूंढना और बदलना है।
# find . -maxdepth 1 -name "*.txt" -type f -exec sed -i 's/wine/champagne/' {} \
हम वर्तमान डायरेक्टरी में सभी टेक्स्ट फ़ाइलों की सूची प्राप्त करने के लिए find कमांड का उपयोग करते हैं। वह भाग है "find . -maxdepth 1 -name "*.txt" -type f"। "find . maxdepth 1" कंप्यूटर को वर्तमान डायरेक्टरी में देखने और वर्तमान डायरेक्टरी से गहरे नहीं जाने के लिए कहता है। '-name "*.txt"' भाग find को केवल ".txt" एक्सटेंशन वाली फ़ाइलों को सूचीबद्ध करने के लिए कहता है। फिर "-type f" खंड निर्दिष्ट करता है कि "find" को केवल सटीक मिलान वाली फ़ाइलों को चुनना चाहिए। अंत में "-exec" भाग "find" को उसके बाद आने वाली कमांड को निष्पादित करने के लिए कहता है, जो इस मामले में टेक्स्ट को बदलने के लिए "sed" कमांड है - "sed -i 's/wine/champagne/' {} \"।
अब जब आप फ़ाइलों में चीजों को ढूंढ और बदल सकते हैं, तो क्यों न हमारे अन्य Linux टिप्स देखें :)