एंड्रॉयड

फ़ाइलों में स्ट्रिंग खोजने और बदलने के लिए sed का उपयोग कैसे करें

W8 L1 Operating system Security

W8 L1 Operating system Security

विषयसूची:

Anonim

पाठ फ़ाइलों के साथ काम करते समय अक्सर आपको एक या अधिक फ़ाइलों में पाठ के तार खोजने और बदलने की आवश्यकता होगी।

sed एक s tream एड इटोर है। यह पाइपलाइनों जैसी फाइलों और इनपुट धाराओं पर बुनियादी पाठ हेरफेर कर सकता है। sed साथ, आप शब्दों और लाइनों को खोज, ढूंढ और बदल सकते हैं, सम्मिलित कर सकते हैं और हटा सकते हैं। यह बुनियादी और विस्तारित नियमित अभिव्यक्तियों का समर्थन करता है जो आपको जटिल पैटर्न से मेल खाने की अनुमति देता है।

, हम इस बारे में बात करेंगे कि कैसे स्ट्रिंग के साथ स्ट्रिंग्स को ढूंढें और प्रतिस्थापित करें। हम आपको यह भी बताएंगे कि एक पुनरावर्ती खोज और प्रतिस्थापन कैसे करें।

ढूँढें और स्ट्रिंग के साथ स्ट्रिंग बदलें

उनके बीच कुछ कार्यात्मक मतभेदों के साथ, sed कई संस्करण हैं। macOS बीएसडी संस्करण का उपयोग करता है और अधिकांश लिनक्स वितरण डिफ़ॉल्ट रूप से जीएनयू sed साथ आते हैं। हम GNU संस्करण का उपयोग करेंगे।

sed का उपयोग करके पाठ को खोजने और बदलने का सामान्य रूप निम्न रूप लेता है:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - डिफ़ॉल्ट रूप से, मानक आउटपुट में अपना आउटपुट लिखता है। यह विकल्प फ़ाइलों को जगह में संपादित करने के लिए sed बताता है। यदि कोई एक्सटेंशन दिया गया है (ex -i.bak) तो मूल फ़ाइल का बैकअप बन जाएगा। s - स्थानापन्न कमांड, शायद sed में सबसे अधिक इस्तेमाल किया जाने वाला कमांड है। / / / - Delimiter चरित्र। यह कोई भी वर्ण हो सकता है लेकिन आमतौर पर स्लैश ( / ) वर्ण का उपयोग किया जाता है। SEARCH_REGEX - सामान्य स्ट्रिंग या खोज करने के लिए एक नियमित अभिव्यक्ति। REPLACEMENT - प्रतिस्थापन स्ट्रिंग। g - वैश्विक प्रतिस्थापन ध्वज। डिफ़ॉल्ट रूप से, sed फ़ाइल लाइन द्वारा लाइन को पढ़ता है और एक लाइन पर SEARCH_REGEX की पहली घटना को SEARCH_REGEX । जब प्रतिस्थापन ध्वज प्रदान किया जाता है, तो सभी घटनाओं को प्रतिस्थापित किया जाएगा। INPUTFILE - उस फ़ाइल का नाम जिस पर आप कमांड चलाना चाहते हैं।

यह तर्क के आसपास उद्धरणों को रखने के लिए एक अच्छा अभ्यास है इसलिए शेल मेटा-वर्णों का विस्तार नहीं होगा।

आइए देखें कि अपने कुछ सबसे अधिक उपयोग किए जाने वाले विकल्पों और झंडे के साथ फ़ाइलों में पाठ को खोजने और बदलने के लिए sed कमांड का उपयोग कैसे करें।

प्रदर्शन उद्देश्यों के लिए, हम निम्नलिखित फ़ाइल का उपयोग करेंगे:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

ग्लोबल रिप्लेसमेंट फ्लैग sed के साथ खोज पैटर्न की सभी घटनाएं होती हैं:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

जैसा कि आपने देखा होगा, पिछले उदाहरण में foobar स्ट्रिंग के अंदर सबसिंग foo को भी बदल दिया गया है। यदि यह वांछित व्यवहार नहीं है, तो खोज स्ट्रिंग के दोनों सिरों पर शब्द-सीमा अभिव्यक्ति ( \b ) का उपयोग करें। यह सुनिश्चित करता है कि आंशिक शब्द मेल नहीं खाते हैं।

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

पैटर्न मैच केस को असंवेदनशील बनाने के लिए, I ध्वज का उपयोग करें। नीचे दिए गए उदाहरण में हम g और I दोनों झंडे का उपयोग कर रहे हैं:

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

आसान और अधिक पठनीय विकल्प एक और सीमांकक चरित्र का उपयोग करना है। अधिकांश लोग वर्टिकल बार ( | ) या कोलन (:) का उपयोग करते हैं, लेकिन आप किसी अन्य वर्ण का उपयोग कर सकते हैं:

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

आप नियमित अभिव्यक्तियों का भी उपयोग कर सकते हैं। उदाहरण के लिए सभी 3 अंकों की संख्या की खोज करें और उन्हें आपके द्वारा उपयोग किए जाने वाले स्ट्रिंग number प्रतिस्थापित करें:

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

सेड की एक अन्य उपयोगी विशेषता यह है कि आप एम्परसेंड चरित्र का उपयोग कर सकते हैं & जो मिलान किए गए पैटर्न से मेल खाता है। चरित्र का उपयोग कई बार किया जा सकता है।

उदाहरण के लिए, यदि आप प्रत्येक 3 अंकों की संख्या के आसपास घुंघराले ब्रेसिज़ जोड़ना चाहते हैं, तो टाइप करें:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

अंतिम लेकिन कम से कम, फ़ाइल को sed साथ संपादित करते समय बैकअप बनाना हमेशा एक अच्छा विचार है। ऐसा करने के लिए बस -i विकल्प को एक एक्सटेंशन प्रदान करें। उदाहरण के लिए, file.txt को संपादित करने और मूल फ़ाइल को file.txt.bak रूप में सहेजने के लिए आप उपयोग करेंगे:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

पुनरावर्ती ढूँढें और बदलें

कभी-कभी आप स्ट्रिंग युक्त फ़ाइलों के लिए निर्देशिकाओं को पुन: खोज करना चाहते हैं और सभी फ़ाइलों में स्ट्रिंग को प्रतिस्थापित करना चाहते हैं। यह निर्देशिका में फ़ाइलों को पुन: प्राप्त करने के लिए कमांड या grep जैसे कमांड का उपयोग करके किया जा सकता है और फ़ाइल नामों को sed करने के लिए पाइपिंग कर सकता है।

निम्न आदेश वर्तमान कार्यशील निर्देशिका में फ़ाइलों की खोज करेगा और फ़ाइल नामों को sed करने के लिए पास करेगा।

find. -type f -exec sed -i 's/foo/bar/g' {} +

उनके नाम में स्थान रखने वाली फ़ाइलों के साथ समस्या से बचने के लिए -print0 विकल्प का उपयोग करें जो बताता है कि फ़ाइल नाम को प्रिंट करें, उसके बाद एक अशक्त वर्ण और पाइप को xargs -0 का उपयोग करके आउटपुट को पाइप करें:

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

एक निर्देशिका को बाहर करने के लिए -not -path विकल्प का उपयोग करें। उदाहरण के लिए, यदि आप डॉट ( . ) के साथ शुरू होने वाली सभी फ़ाइलों को बाहर करने के लिए अपने स्थानीय गिट रेपो में एक स्ट्रिंग की जगह ले रहे हैं, तो उपयोग करें:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

एक अन्य विकल्प यह है कि grep कमांड का उपयोग खोज पैटर्न वाले सभी फ़ाइलों को पुन: प्राप्त करने के लिए करें और फिर फ़ाइल नाम को sed करने के लिए पाइप करें:

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

निष्कर्ष

हालांकि यह जटिल और जटिल लग सकता है, सबसे पहले, sed साथ फाइलों में पाठ को खोजना और बदलना बहुत सरल है।

sed कमांड के बारे में अधिक जानने के लिए, विकल्प और झंडे GNU sed मैनुअल और Grymoire sed ट्यूटोरियल पर जाएँ। यदि आपके कोई प्रश्न या प्रतिक्रिया है, तो टिप्पणी छोड़ने के लिए स्वतंत्र महसूस करें।

sed टर्मिनल