यह लेख चल रही यूनिक्स Sed टिप्स एंड ट्रिक्स श्रृंखला का हिस्सा है।
हमारे पिछले sed लेखों में हमने सीखा - sed प्रिंटिंग, sed डिलीशन, sed सब्स्टीट्यूट, sed फ़ाइल राइट, और sed मल्टीपल कमांड।
इस लेख में, आइए कई व्यावहारिक उदाहरणों के साथ sed में "s" सब्स्टीट्यूट कमांड के साथ कुछ दिलचस्प वर्कअराउंड की समीक्षा करें।
I. Sed सब्स्टीट्यूशन डिलीमीटर
जैसा कि हमने अपनी पिछली पोस्ट में चर्चा की थी, हम sed सब्स्टीट्यूट कमांड में @ % | ; : जैसे विभिन्न डिलीमीटर का उपयोग कर सकते हैं।
आइए पहले path.txt फ़ाइल बनाएं जिसका उपयोग नीचे उल्लिखित सभी उदाहरणों में किया जाएगा।
$ cat path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
उदाहरण 1 – sed @ डिलीमीटर: /opt/omni/lbin को /opt/tools/bin में प्रतिस्थापित करें
जब आप किसी पथ नाम को प्रतिस्थापित करते हैं जिसमें '/' होता है, तो आप '/' के बजाय @ को डिलीमीटर के रूप में उपयोग कर सकते हैं। नीचे दिए गए sed उदाहरण में, इनपुट फ़ाइल की अंतिम पंक्ति में, /opt/omni/lbin को /opt/tools/bin में बदल दिया गया था।
$ sed 's@/opt/omni/lbin@/opt/tools/bin@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
उदाहरण 2 – sed / डिलीमीटर: /opt/omni/lbin को /opt/tools/bin में प्रतिस्थापित करें
जब आपको पथ नाम संबंधी प्रतिस्थापन में '/' का उपयोग करना चाहिए, तो आपको प्रतिस्थापन डेटा में '/' को एस्केप करना होगा जैसा कि नीचे दिखाया गया है। इस sed उदाहरण में, डिलीमीटर '/' को REGEXP और REPLACEMENT भाग में एस्केप किया गया था।
$ sed 's/\/opt\/omni\/lbin/\/opt\/tools\/bin/g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
II. Sed '&' मिलान स्ट्रिंग प्राप्त करें
एक इनपुट लाइन का सटीक भाग जिस पर नियमित अभिव्यक्ति मेल खाती है, & द्वारा दर्शाया जाता है, जिसका उपयोग प्रतिस्थापन भाग में किया जा सकता है।
उदाहरण 1 – sed & उपयोग: /usr/bin/ को /usr/bin/local में प्रतिस्थापित करें
$ sed 's@/usr/bin@&/local@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin/local:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin/local:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
उपरोक्त उदाहरण में प्रतिस्थापन भाग में '&' मिलान पैटर्न /usr/bin से प्रतिस्थापित होगा और इसे /local के साथ जोड़ देगा। इसलिए आउटपुट में /usr/bin की सभी घटनाओं को /usr/bin/local से प्रतिस्थापित किया जाएगा
उदाहरण 2 – sed & उपयोग: पूरी लाइन से मिलान करें
& दिए गए REGEXP से मेल खाने वाली किसी भी चीज़ को प्रतिस्थापित करता है।
$ sed 's@^.*$@<<<&>>>@g' path.txt <<</usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin>>> <<</usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:>>> <<</opt/omni/lbin:/opt/omni/sbin:/root/bin>>>
उपरोक्त उदाहरण में regexp में "^.*$" है जो पूरी लाइन से मेल खाता है। प्रतिस्थापन भाग <<<&>>> लाइन की शुरुआत और अंत में क्रमशः <<< और >>> के साथ पूरी लाइन लिखता है।
III. Sed में ग्रुपिंग और बैक-रेफरेंस
ग्रुपिंग का उपयोग sed में सामान्य नियमित अभिव्यक्ति की तरह किया जा सकता है। एक ग्रुप "(" से खुलता है और ")" से बंद होता है। ग्रुपिंग का उपयोग बैक-रेफरेंसिंग के संयोजन में किया जा सकता है।
बैक-रेफरेंस ग्रुपिंग द्वारा चयनित नियमित अभिव्यक्ति के एक भाग का पुन: उपयोग है। Sed में बैक-रेफरेंस का उपयोग नियमित अभिव्यक्ति और सब्स्टीट्यूट कमांड के प्रतिस्थापन भाग दोनों में किया जा सकता है।
उदाहरण 1: प्रत्येक लाइन में केवल पहला पथ प्राप्त करें
$ sed 's/\(\/[^:]*\).*/\1/g' path.txt /usr/kbos/bin /usr/local/sbin /opt/omni/lbin
उपरोक्त उदाहरण में, \(\/[^:]*\) पहले : आने से पहले उपलब्ध पथ से मेल खाता है। \1 पहले मिलान ग्रुप को प्रतिस्थापित करता है।
उदाहरण 2: मल्टीग्रुपिंग
फ़ाइल path.txt में फ़ाइल की अंतिम पंक्ति में फ़ील्ड का क्रम बदलें।
$ sed '$s@\([^:]*\):\([^:]*\):\([^:]*\)@\3:\2:\1@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/omni/bin: /root/bin:/opt/omni/sbin:/opt/omni/lbin
उपरोक्त कमांड में $ निर्दिष्ट करता है कि प्रतिस्थापन केवल अंतिम पंक्ति के लिए होगा। आउटपुट दिखाता है कि अंतिम पंक्ति में पथ मानों का क्रम उलट दिया गया है।
उदाहरण 3: /etc/passwd फ़ाइल में उपयोगकर्ता नामों की सूची प्राप्त करें
यह sed उदाहरण /etc/passwd फ़ाइल से केवल पहला फ़ील्ड प्रदर्शित करता है।
$sed 's/\([^:]*\).*/\1/' /etc/passwd root bin daemon adm lp sync shutdown
उदाहरण 4: प्रत्येक शब्द के पहले वर्ण को पैरेंथेसाइज़ करें
यह sed उदाहरण प्रत्येक शब्द के पहले वर्ण को पैरेंथेसिस में प्रिंट करता है।
$ echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g' (W)elcome (T)o (T)he (G)eek (S)tuff
उदाहरण 5: साधारण संख्या को कॉमिफाई करें।
आइए numbers नामक फ़ाइल बनाएं जिसमें संख्याओं की सूची हो। नीचे दिया गया sed कमांड उदाहरण हजारों तक संख्याओं को कॉमिफाई करने के लिए उपयोग किया जाता है।
$ cat numbers 1234 12121 3434 123 $sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers 1,234 12,121 3,434 123