सवाल आदेशों का उपयोग कर फ़ाइल में टेक्स्ट ढूंढें और बदलें


मैं कमांड लाइन का उपयोग कर टेक्स्ट फ़ाइल में विशिष्ट शब्दों को कैसे ढूंढ और प्रतिस्थापित कर सकता हूं?


437
2018-01-07 04:10


मूल


आपकी रुचि का मई github.com/lucio-martinez/rch :-) - Lucio


जवाब:


sed -i 's/original/new/g' file.txt

स्पष्टीकरण:

  • sed = स्ट्रीम संपादक
  • -i = जगह में (यानी मूल फ़ाइल पर वापस सहेजें)
  • कमांड स्ट्रिंग:

    • s = विकल्प कमांड
    • original = एक नियमित अभिव्यक्ति शब्द को प्रतिस्थापित करने का वर्णन करती है (या केवल शब्द ही)
    • new = पाठ को इसके साथ बदलने के लिए
    • g = वैश्विक (यानी सभी को प्रतिस्थापित करें और न केवल पहली घटना)
  • file.txt = फ़ाइल का नाम


728
2018-01-07 04:23



@ एमसी एक्सचेंज अगर यह विशेष रूप से है / चरित्र जिसे आप मिलान करने की ज़रूरत है, आप बस कुछ अन्य चरित्र को विभाजक के रूप में उपयोग कर सकते हैं (उदा। 's_old/text_new/text_g')। अन्यथा, आप एक डाल सकते हैं \  किसी से पहले $ * . [ \ ^ शाब्दिक चरित्र प्राप्त करने के लिए। - cscarney
@BrianZ जहां तक ​​फ़ाइल सिस्टम का संबंध है, sed के आउटपुट एक ही नाम के साथ एक नई फाइल है। यह एक है आम तौर पर रिपोर्ट की गई बग जो बग नहीं हैं - cscarney
आप चाहेंगे s/\boriginal\b/new/g के बजाय s/original/new/g (\b एक शब्द सीमा पर मेल खाता है) केवल पूरे शब्दों को प्रतिस्थापित करने के लिए। - Chris Martin
ओएसएक्स कमांड sed -i '.bak' 's/original/new/g' file.txt शून्य-लंबाई विस्तार के साथ भी चलाया जा सकता है sed -i '' 's/original/new/g' file.txt, जो कोई बैकअप उत्पन्न नहीं करेगा। - Kirk
मैकोज़ उपयोगकर्ताओं को -i के बाद पैरामीटर के रूप में '' 'जोड़ना होगा ed.gs/2016/01/26/os-x-sed-invalid-command-code ताकि फाइल ओवरराइट हो जाएगी। - geoyws


ऐसा करने के कई तरीके हैं। एक प्रयोग कर रहा है sed और रेगेक्स। एसईडी पाठ को फ़िल्टर करने और बदलने के लिए एक स्ट्रीम संपादक है। एक उदाहरण निम्नानुसार है:

marco@imacs-suck: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orly
marco@imacs-suck: ~$ sed s/slow/quick/ < orly > yarly
marco@imacs-suck: ~$ cat yarly
The quick brown unicorn jumped over the hyper sleeping dog

एक और तरीका जो अधिक समझ में आता है < strin तथा > strout पाइप के साथ है!

marco@imacs-suck: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowai
marco@imacs-suck: ~$ cat nowai 
The quick brown fox jumped over the lazy sleeping dog

26
2018-01-07 04:26



ध्यान दें cat में cat file | sed '...' अनावश्यक है आप सीधे कह सकते हैं sed '...' file। - fedorqui
वास्तव में इसे और भी कम किया जा सकता है: sed -i'.bak' -e 's/unicorn/fox/g;s/hyper/brown/g' yarly बैकअप बनाने के दौरान फ़ाइल को yarly ले जाएगा और जगह में 2 परिवर्तन करेंगे। का उपयोग करते हुए time bash -c "$COMMAND" समय के साथ यह सुझाव देता है कि यह संस्करण ~ 5 गुना तेज है। - pbhj


आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -sc '%s/OLD/NEW/g|x' file
  1. % सभी लाइनों का चयन करें

  2. s विकल्प

  3. g प्रत्येक पंक्ति में सभी उदाहरणों को प्रतिस्थापित करें

  4. x लिखें कि परिवर्तन किए गए हैं (उनके पास है) और बाहर निकलें


15
2018-04-16 18:36





Awk के gsub कमांड के माध्यम से,

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 के साथ 1 को प्रतिस्थापित करता है।

पर्ल के माध्यम से,

$ echo 'foo' | perl -pe 's/foo/bar/g'
bar

14
2017-07-02 12:59



मैंने मैकोज़ टर्मिनल पर इसका इस्तेमाल किया और यह कुछ भी नहीं किया ... - Jim


इसे हासिल करने के कई तरीके हैं। स्ट्रिंग प्रतिस्थापन के साथ क्या हासिल करने की कोशिश की जटिलता के आधार पर, और उन उपकरणों के आधार पर जो उपयोगकर्ता परिचित हैं, कुछ तरीकों को दूसरों से अधिक पसंद किया जा सकता है।

इस जवाब में मैं सरल उपयोग कर रहा हूँ input.txt फ़ाइल, जिसे आप यहां प्रदान किए गए सभी उदाहरणों का परीक्षण करने के लिए उपयोग कर सकते हैं। फ़ाइल सामग्री:

roses are red , violets are blue
This is an input.txt and this doesn't rhyme

दे घुमा के

बैश वास्तव में पाठ प्रसंस्करण के लिए नहीं है, लेकिन सरल प्रतिस्थापन के माध्यम से किया जा सकता है पैरामीटर विस्तार , विशेष रूप से यहां हम सरल संरचना का उपयोग कर सकते हैं ${parameter/old_string/new_string}

#!/bin/bash
while IFS= read -r line
do
    case "$line" in
       *blue*) printf "%s\n" "${line/blue/azure}" ;;
       *) printf "%s\n" "$line" ;;
    esac
done < input.txt

यह छोटी लिपि इन-प्लेस प्रतिस्थापन नहीं करती है, जिसका अर्थ है कि आपको नई फ़ाइल को नई फ़ाइल में सहेजना होगा, और पुरानी फ़ाइल से छुटकारा पाना होगा, या mv new.txt old.txt

साइड नोट: यदि आप क्यों उत्सुक हैं while IFS= read -r ; do ... done < input.txt इसका उपयोग किया जाता है, यह मूल रूप से रेखा से फ़ाइल लाइन पढ़ने का खोल तरीका है। देख इस सन्दर्भ के लिए।

AWK

एडब्ल्यूके, एक पाठ प्रसंस्करण उपयोगिता होने के नाते, इस तरह के कार्य के लिए काफी उपयुक्त है। यह सरल प्रतिस्थापन और अधिक उन्नत लोगों के आधार पर कर सकता है नियमित अभिव्यक्ति। यह दो कार्य प्रदान करता है: 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 's/blue/azure/' input.txt

इस उपकरण के बारे में क्या अच्छा है कि इसमें जगह-जगह संपादन है, जिसे आप सक्षम कर सकते हैं -i झंडा।

पर्ल

पर्ल एक और उपकरण है जिसे अक्सर टेक्स्ट प्रसंस्करण के लिए उपयोग किया जाता है, लेकिन यह एक सामान्य उद्देश्य भाषा है, और इसका उपयोग नेटवर्किंग, सिस्टम प्रशासन, डेस्कटॉप ऐप्स और कई अन्य स्थानों में किया जाता है। इसने सी, sed, awk, और अन्य जैसी अन्य भाषाओं से कई अवधारणाओं / विशेषताओं को उधार लिया। सरल प्रतिस्थापन इस प्रकार किया जा सकता है:

perl -pe 's/blue/azure/' input.txt

Sed की तरह, perl भी -i झंडा है।

अजगर

यह भाषा बहुत बहुमुखी है और विभिन्न प्रकार के अनुप्रयोगों में भी इसका उपयोग किया जाता है। तारों के साथ काम करने के लिए इसमें बहुत सारे काम हैं, जिनमें से है 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 python
import sys
import os
import tempfile

tmp=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 कमांड लाइन तर्क के रूप में।

पाइथन नियमित रूप से नियमित अभिव्यक्ति भी कर सकता है, विशेष रूप से, वहां है re मॉड्यूल, जो है re.sub() फ़ंक्शन, जिसका उपयोग अधिक उन्नत प्रतिस्थापन के लिए किया जा सकता है।


12
2018-02-03 07:49





sed है रोंtream ईडीitor, उसमें आप उपयोग कर सकते हैं | (पाइप) भेजने के लिए मानक धाराएं (विशेष रूप से एसटीडीआईएन और एसटीडीओयूटी) के माध्यम से sed और उन्हें फ्लाई पर प्रोग्रामेटिक रूप से बदलें, जिससे यूनिक्स दर्शन परंपरा में यह एक आसान टूल बन गया; लेकिन इसका उपयोग कर, फ़ाइलों को भी सीधे संपादित कर सकते हैं -i नीचे वर्णित पैरामीटर।
निम्नलिखित को धयान मे रखते हुए:

sed -i -e 's/few/asd/g' hello.txt

s/ उपयोग किया जाता है रोंमिली अभिव्यक्ति का उपयोग करें few साथ में asd:

कुछ, बहादुर।


Asd, बहादुर।

/g "वैश्विक" के लिए खड़ा है, जिसका अर्थ है पूरी लाइन के लिए ऐसा करना। यदि आप छोड़ देते हैं /g (साथ में s/few/asd/, वहां कोई फर्क नहीं पड़ता कि तीन स्लेश होने की ज़रूरत है) और few एक ही पंक्ति पर दो बार प्रकट होता है, केवल पहला few में बदल गया है asd:

कुछ पुरुष, कुछ महिलाएं, बहादुर।


Asd पुरुष, कुछ महिलाएं, बहादुर।

यह कुछ परिस्थितियों में उपयोगी है, जैसे लाइनों की शुरुआत में विशेष पात्रों को बदलने (उदाहरण के लिए, कुछ लोगों को प्रतीकों से अधिक की जगह बदलना, कुछ लोगों को क्षैतिज टैब के साथ ईमेल थ्रेड में पिछले सामग्री को उद्धृत करने के लिए उपयोग किया जाता है जबकि पंक्ति में बाद में उद्धृत बीजगणित असमानता को छोड़कर छेड़छाड़), लेकिन आपके उदाहरण में जहां आप इसे निर्दिष्ट करते हैं कहीं भी  few ऐसा होता है कि इसे प्रतिस्थापित किया जाना चाहिए, सुनिश्चित करें कि आपके पास यह है /g

निम्नलिखित दो विकल्प (झंडे) एक में संयुक्त होते हैं, -ie:

-i विकल्प को संपादित करने के लिए प्रयोग किया जाता है मैंफ़ाइल पर एन जगह hello.txt

-e विकल्प इंगित करता है इस मामले में, xpression / चलाने के लिए आदेश s/

नोट: यह महत्वपूर्ण है कि आप इसका उपयोग करें -i -e खोजने / प्रतिस्थापित करने के लिए। यदि तुम करो -ie, आप संलग्न 'अक्षर' अक्षर के साथ प्रत्येक फ़ाइल का बैकअप बनाते हैं।


6
2017-11-23 09:00





आप ऐसा कर सकते हैं:

locate <part of filaname to locate> | xargs sed -i -e "s/<Old text>/<new text>/g" 

उदाहरण: सभी कमांडों को बदलने के लिए [logdir ',' '] (बिना []) [logdir', os.getcwd ()] को उन सभी फ़ाइलों में खोजें जो पता कमांड के परिणाम हैं, करें:

locate tensorboard/program.py | xargs sed -i -e "s/logdir', ''/logdir', os.getcwd()/g"

जहां [tensorboard / program.py] खोज करने के लिए फ़ाइल है


0
2017-07-24 02:13



नमस्ते। तारों की आपकी पसंद (logdir', '' -> /logdir', os.getcwd()) इस जवाब को पार्स करने में कठोर बनाता है। साथ ही, यह निर्दिष्ट करने लायक है कि आपका उत्तर पहले फ़ाइलों का उपयोग करने के लिए फ़ाइलों को रेखांकित करता है, क्योंकि यह प्रश्न का हिस्सा नहीं है। - mwfearnley
हाय, यह उत्तर दोनों खोज और प्रतिस्थापित है अगर इसे फ़ाइल में <पुराना पाठ> मिला। - Nguyễn Tuấn Anh
मैं इस जवाब को उन सभी के लिए चुनता हूं जो वे कैमरे में टेंसरबोर्ड का उपयोग करते हैं, जो कमांड को बदलना चाहते हैं: tensorboard --logdir = '/ path / to / log / folder /' का उपयोग करने के लिए: लॉग फ़ोल्डर में रहते समय केवल तेंसबोर्ड। यह बहुत सुविधाजनक है - Nguyễn Tuấn Anh