मैं कमांड लाइन का उपयोग करके टेक्स्ट फ़ाइल में विशिष्ट शब्दों को कैसे ढूंढ और बदल सकता हूं?
sed -i 's/original/new/g' file.txt
स्पष्टीकरण:
-
sed
= स्ट्रीम संपादक -
-i
= इन-प्लेस (यानी मूल फ़ाइल में वापस सहेजें) -
कमांड स्ट्रिंग:
-
s
= स्थानापन्न आदेश -
original
= बदलने के लिए शब्द का वर्णन करने वाली एक नियमित अभिव्यक्ति ( या केवल शब्द ही) -
new
= इसे बदलने के लिए पाठ -
g
= वैश्विक ( यानी सभी को बदलें और न केवल पहली घटना)
-
file.txt
= फ़ाइल का नाम
इसे हासिल करने के कई तरीके हैं । स्ट्रिंग प्रतिस्थापन के साथ क्या हासिल करने की कोशिश की जटिलता के आधार पर, और उन उपकरणों के आधार पर जिनके साथ उपयोगकर्ता परिचित है, कुछ तरीकों को दूसरों की तुलना में अधिक पसंद किया जा सकता है ।
इस उत्तर में मैं सरल उपयोग कर रहा हूं input.txt
फ़ाइल, जिसका उपयोग आप यहां दिए गए सभी उदाहरणों का परीक्षण करने के लिए कर सकते हैं । फ़ाइल सामग्री:
roses are red , violets are blueThis is an input.txt and this doesn't rhyme
बैश
बैश वास्तव में टेक्स्ट प्रोसेसिंग के लिए नहीं है, लेकिन सरल प्रतिस्थापन के माध्यम से किया जा सकता है पैरामीटर विस्तार , विशेष रूप से यहां हम सरल संरचना का उपयोग कर सकते हैं ${parameter/old_string/new_string}
.
#!/bin/bashwhile IFS= read -r linedo case "$line" in *blue*) printf "%s\n" "${line/blue/azure}" ;; *) printf "%s\n" "$line" ;; esacdone < input.txt
यह छोटी स्क्रिप्ट इन-प्लेस रिप्लेसमेंट नहीं करती है, जिसका अर्थ है कि आपको नए टेक्स्ट को नई फाइल में सेव करना होगा, और पुरानी फाइल से छुटकारा पाना होगा, या mv new.txt old.txt
साइड नोट: यदि आप इस बारे में उत्सुक हैं कि क्यों while IFS= read -r ; do ... done < input.txt
उपयोग किया जाता है, यह मूल रूप से लाइन द्वारा फ़ाइल लाइन पढ़ने का शेल का तरीका है । देखें इस संदर्भ के लिए ।
एडब्ल्यूके
एडब्ल्यूके, एक पाठ प्रसंस्करण उपयोगिता होने के नाते, इस तरह के कार्य के लिए काफी उपयुक्त है । यह सरल प्रतिस्थापन और बहुत अधिक उन्नत लोगों के आधार पर कर सकता है नियमित अभिव्यक्ति. यह दो कार्य प्रदान करता है: sub()
और gsub()
. पहला केवल पहली घटना को प्रतिस्थापित करता है, जबकि दूसरा-पूरे स्ट्रिंग में घटनाओं को प्रतिस्थापित करता है । उदाहरण के लिए, अगर हमारे पास स्ट्रिंग है one potato two potato
, यह परिणाम होगा:
$ echo "one potato two potato" | awk '{gsub(/potato/,"banana")}1'one banana two banana$ echo "one potato two potato" | awk '{sub(/potato/,"banana")}1' one banana two potato
एडब्ल्यूके एक इनपुट फ़ाइल को तर्क के रूप में ले सकता है, इसलिए वही चीजें कर रहा है input.txt
, आसान होगा:
awk '{sub(/blue/,"azure")}1' input.txt
आपके पास एडब्ल्यूके के संस्करण के आधार पर, इसमें इन-प्लेस संपादन हो भी सकता है और नहीं भी, इसलिए सामान्य अभ्यास है नए पाठ को सहेजें और बदलें । उदाहरण के लिए कुछ इस तरह:
awk '{sub(/blue/,"azure")}1' input.txt > temp.txt && mv temp.txt input.txt
SED
Sed एक लाइन संपादक. यह नियमित अभिव्यक्तियों का भी उपयोग करता है, लेकिन सरल प्रतिस्थापन के लिए यह करना पर्याप्त है:
sed 's/blue/azure/' input.txt
इस टूल के बारे में अच्छी बात यह है कि इसमें इन-प्लेस एडिटिंग है, जिसे आप इनेबल कर सकते हैं -i
झंडा।
पर्ल
पर्ल अक्सर पाठ प्रसंस्करण के लिए प्रयोग किया जाता है जो एक अन्य उपकरण है, लेकिन यह एक सामान्य प्रयोजन भाषा है, और नेटवर्किंग, सिस्टम प्रशासन, डेस्कटॉप क्षुधा, और कई अन्य स्थानों में प्रयोग किया जाता है । इसने सी,एसईडी,एडब्ल्यूके, और अन्य जैसी अन्य भाषाओं से बहुत सारी अवधारणाओं/विशेषताओं को उधार लिया । सरल प्रतिस्थापन इस प्रकार किया जा सकता है:
perl -pe 's/blue/azure/' input.txt
एसईडी की तरह, पर्ल में भी-आई ध्वज है ।
अजगर
यह भाषा बहुत बहुमुखी है और इसका उपयोग विभिन्न प्रकार के अनुप्रयोगों में भी किया जाता है । इसमें स्ट्रिंग्स के साथ काम करने के लिए बहुत सारे कार्य हैं, जिनमें से है replace()
, इसलिए यदि आपके पास चर है जैसे var="Hello World"
, आप कर सकते थे var.replace("Hello","Good Morning")
फ़ाइल को पढ़ने और स्ट्रिंग को बदलने का सरल तरीका ऐसा होगा:
python -c "import sys;lines=sys.stdin.read();print lines.replace('blue','azure')" < input.txt
पायथन के साथ , हालांकि, आपको नई फ़ाइल में आउटपुट करने की भी आवश्यकता है, जिसे आप स्क्रिप्ट के भीतर से भी कर सकते हैं । उदाहरण के लिए, यहाँ एक सरल है:
#!/usr/bin/env pythonimport sysimport osimport tempfiletmp=tempfile.mkstemp()with open(sys.argv[1]) as fd1, open(tmp[1],'w') as fd2: for line in fd1: line = line.replace('blue','azure') fd2.write(line)os.rename(tmp[1],sys.argv[1])
इस स्क्रिप्ट के साथ बुलाया जाना है input.txt
कमांड लाइन तर्क के रूप में । कमांड-लाइन तर्क के साथ पायथन स्क्रिप्ट चलाने के लिए सटीक कमांड होगा
$ ./myscript.py input.txt
या
$ python ./myscript.py input.txt
बेशक, सुनिश्चित करें कि ./myscript.py
आपकी वर्तमान कार्यशील निर्देशिका में है और पहले तरीके से, सुनिश्चित करें कि यह निष्पादन योग्य है chmod +x ./myscript.py
पायथन में नियमित अभिव्यक्ति भी हो सकती है , विशेष रूप से, वहाँ है re
मॉड्यूल, जो है re.sub()
समारोह, जो और अधिक उन्नत प्रतिस्थापन के लिए इस्तेमाल किया जा सकता.
ऐसा करने के कई तरीके हैं । एक उपयोग कर रहा है sed
और Regex. एसईडी पाठ को फ़िल्टर करने और बदलने के लिए एक स्ट्रीम संपादक है । एक उदाहरण इस प्रकार है:
marco@imacs-suck: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orlymarco@imacs-suck: ~$ sed s/slow/quick/ < orly > yarlymarco@imacs-suck: ~$ cat yarlyThe quick brown unicorn jumped over the hyper sleeping dog
एक और तरीका है जो अधिक से अधिक समझ कर सकते हैं < strin
और > strout
पाइप के साथ है!
marco@imacs-suck: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowaimarco@imacs-suck: ~$ cat nowai The quick brown fox jumped over the lazy sleeping dog
एडब्ल्यूके के जीएसयूबी कमांड के माध्यम से,
awk '{gsub(/pattern/,"replacement")}' file
उदाहरण:
awk '{gsub(/1/,"0");}' file
उपरोक्त उदाहरण में, सभी 1 को कॉलम के बावजूद 0 से बदल दिया जाता है जहां यह स्थित है ।
यदि आप किसी विशिष्ट कॉलम पर प्रतिस्थापन करना चाहते हैं, तो ऐसा करें,
awk '{gsub(/pattern/,"replacement",column_number)}' file
उदाहरण:
awk '{gsub(/1/,"0",$1);}' file
यह केवल पहले कॉलम पर 1 को 0 से बदल देता है ।
पर्ल के माध्यम से,
$ echo 'foo' | perl -pe 's/foo/bar/g'bar
आप पूर्व मोड में विम का उपयोग कर सकते हैं:
ex -s -c '%s/OLD/NEW/g|x' file
%
सभी लाइनों का चयन करेंs
स्थानापन्नg
प्रत्येक पंक्ति में सभी उदाहरणों को बदलेंx
लिखें कि क्या परिवर्तन किए गए हैं (उनके पास) और बाहर निकलें
sed
है stream ईडीitor, जिसमें आप उपयोग कर सकते हैं |
(पाइप) भेजने के लिए मानक धाराओं (STDIN और STDOUT विशेष रूप से) के माध्यम से sed
और उन्हें मक्खी पर प्रोग्रामेटिक रूप से बदल दें, जिससे यह यूनिक्स दर्शन परंपरा में एक उपयोगी उपकरण बन जाए; लेकिन फ़ाइलों को सीधे संपादित कर सकते हैं, भी, का उपयोग कर -i
नीचे उल्लिखित पैरामीटर।
निम्नलिखित पर विचार करें:
sed -i -e 's/few/asd/g' hello.txt
s/
के लिए प्रयोग किया जाता है substitute को अभिव्यक्ति मिली few
साथ में asd
:
कुछ, बहादुर।
Asd, बहादुर.
/g
"वैश्विक" के लिए खड़ा है, जिसका अर्थ है पूरी लाइन के लिए ऐसा करना । यदि आप छोड़ देते हैं /g
(साथ में s/few/asd/
, हमेशा तीन स्लैश होने की जरूरत है चाहे कुछ भी हो) और few
एक ही लाइन पर दो बार दिखाई देता है, केवल पहला few
में बदल गया है asd
:
कुछ पुरुष, कुछ महिलाएं, बहादुर ।
एएसडी पुरुष, कुछ महिलाएं, बहादुर ।
यह कुछ परिस्थितियों में उपयोगी है, जैसे लाइनों की शुरुआत में विशेष वर्णों को बदलना (उदाहरण के लिए, अधिक से अधिक प्रतीकों की जगह कुछ लोग ईमेल थ्रेड में पिछली सामग्री को क्षैतिज टैब के साथ उद्धृत करने के लिए उपयोग करते हैं, जबकि बाद में लाइन में उद्धृत बीजीय असमानता को छोड़ दिया जाता है) अछूता), लेकिन आपके उदाहरण में जहां कहीं भी few
होता है इसे बदला जाना चाहिए, सुनिश्चित करें कि आपके पास वह है /g
.
निम्नलिखित दो विकल्प (झंडे) एक में संयुक्त हैं, -ie
:
-i
विकल्प का उपयोग संपादित करने के लिए किया जाता है iफ़ाइल पर एन जगह hello.txt
.
-e
विकल्प इंगित करता है eइस मामले में चलाने के लिए एक्सप्रेशन/कमांड s/
.
नोट: यह महत्वपूर्ण है कि आप उपयोग करें -i -e
खोजने / बदलने के लिए । यदि आप करते हैं -ie
, आप 'ई' अक्षर के साथ प्रत्येक फ़ाइल का बैकअप बनाते हैं ।
आप इस तरह कर सकते हैं:
locate <part of filaname to locate> | xargs sed -i -e "s/<Old text>/<new text>/g"
उदाहरण: सभी घटनाओं को बदलने के लिए [लॉगडिर', "] (बिना []) [लॉगडिर', ओएस के साथ । गेटसीडब्ल्यूडी ()] उन सभी फाइलों में जो लोकेट कमांड के परिणाम हैं, करें:
ex1:
locate tensorboard/program.py | xargs sed -i -e "s/old_text/NewText/g"
ex2:
locate tensorboard/program.py | xargs sed -i -e "s/logdir', ''/logdir', os.getcwd()/g"
कहां [tensorboard/program.py] खोज करने के लिए फ़ाइल है