लिनक्स कमांड लाइन में कई फाइलों में स्ट्रिंग को कैसे बदलें


460

मुझे फ़ोल्डर में बहुत सारी फाइलों में स्ट्रिंग को बदलने की आवश्यकता है, केवल sshसर्वर तक पहुंच के साथ । मैं यह कैसे कर सकता हूँ?

जवाबों:


601
cd /path/to/your/folder
sed -i 's/foo/bar/g' *

"फू" के अवसरों को "बार" से बदल दिया जाएगा।

बीएसडी सिस्टम जैसे macOS पर, आपको मेन्यू के अनुसार बैकअप एक्सटेंशन -i '.bak'या फिर "जोखिम भ्रष्टाचार या आंशिक सामग्री" प्रदान करने की आवश्यकता है ।

cd /path/to/your/folder
sed -i '.bak' 's/foo/bar/g' *

13
यह मेरे लिए काम नहीं करता है अगर स्ट्रिंग में व्हाट्सएप या विशेष वर्ण हैं। किसी भी विचार क्यों ऐसा हो सकता है, या क्या मुझे उन्हें कुछ बचने की आवश्यकता है? धन्यवाद!
मैथ्यू हर्बस्ट

13
कम से कम मेरे संस्करण के लिए sed, -iइसके बाद एक स्ट्रिंग की आवश्यकता होती है, जिसे पुराने फ़ाइल नामों से जोड़ा जाता है। इसलिए sed -i .bak 's/foo/bar/g' *.xxसभी .xxफाइलों को समतुल्य .xx.bakनाम पर ले जाता है और फिर .xxफू → बार प्रतिस्थापन के साथ फाइल उत्पन्न करता है ।
अनौपचारिक

24
यदि कोई अधिक विकल्पों की तलाश करना चाहता है, तो यूनिक्स स्टैक एक्सचेंज पर एक जवाब है जो अधिक उपयोग के मामलों को कवर करता है साइट unix.stackexchange.com/a/112024/13488
Reddy

19
@MatthewHerbst रिक्त स्थान से बचने के लिए, \ तरह का उपयोग करें sed -i 's/foo\ with\ spaces/bar/g' *। मुझे लगता है कि आप इतने लंबे समय के बाद पता चला है ... लेकिन इस तरह से यह दूसरों के लिए एक ही मुद्दा खोजने के लिए रहता है।
मैनुवलविर्सिया

5
कुछ पुनरावर्ती के लिए आप निम्नलिखित प्रयास कर सकते हैं। ध्यान दें कि यह काम नहीं करता है यदि फ़ाइलों की सूची बहुत बड़ी है। sed -i -e 's/foo/bar/g' $(find /home/user/base/dir)
स्कॉट

243

कास्पर के जवाब के समान लेकिन एक रेखा पर सभी घटनाओं को बदलने के लिए जी ध्वज के साथ।

find ./ -type f -exec sed -i 's/string1/string2/g' {} \;

वैश्विक मामले के लिए असंवेदनशील:

find ./ -type f -exec sed -i 's/string1/string2/gI' {} \;

23
यदि आप OSX पर हैं और आपके पैटर्न में डॉट्स हो सकते हैं और आप इन-प्लेस रिप्लेसमेंट (कोई बैकअप फ़ाइल नहीं) चाहते हैं, तो आपको इसका उपयोग करना चाहिए LC_ALL=C find ./ -type f -exec sed -i '' -e 's/proc.priv/priv/g' {} \;( यह पोस्ट देखें और यह एक )
जोनाथन एच।

2
यह निश्चित रूप से मेरे लिए काम करता है, क्योंकि यह "* .js" के साथ फ़िल्टर करने में सक्षम बनाता है
मार्सेलो डे सेल्स

1
एक क्रिया विकल्प अच्छा होगा, लेकिन आप यह देखने के लिए कि क्या बदलाव किए गए थे, बस फिर से वापस आ सकते हैं। नोट: वाइल्डकार्ड्स के लिए, '-name "* .php" का प्रयोग करें और grep रिकर्सियन और वाइल्डकार्ड के साथ खराब है, आपको --include=*.whatever-r के साथ जोड़ने की जरूरत है
PJ Brunet

12
चेक-आउट Git रेपो की जड़ से ऐसा न करें। आप गलती से इसके डेटाबेस को दूषित कर सकते हैं .git/cdनिचले स्तर तक नीचे जाना सुनिश्चित करें ।
इरिकप्रिस

1
मैंने अभी-अभी अपने गिट रेपो में यह किया है और अब git statusरिटर्न error: bad index file sha1 signature.... fatal: index file corrupt:। क्या देता है?
जिन

165

@ केव का उत्तर अच्छा है, लेकिन केवल तत्काल निर्देशिका में फ़ाइलों को प्रभावित करता है। नीचे दिए गए उदाहरण grep का उपयोग करके फ़ाइलों को पुन: खोजते हैं। यह मेरे लिए हर काम करता है।

grep -rli 'old-word' * | xargs -i@ sed -i 's/old-word/new-word/g' @

कमान टूटना

grep -r : --recursive , प्रत्येक निर्देशिका के अंतर्गत सभी फ़ाइलों को पुन: पढ़ने के लिए।
grep -l : --print-with- match, प्रत्येक फाइल के नाम को प्रिंट करता है जिसमें मैचिंग लाइनें प्रिंट करने के बजाय एक मैच होता है।
grep -i : --ignore-case

xargs : STDIN को तर्कों में रूपांतरित करें, इस उत्तर का पालन करें ।
xargs -i @ ~ कमांड में ~ ~ शामिल हैं : तर्क के लिए एक प्लेसहोल्डर ~ कमांड ~ में एक विशिष्ट स्थिति में उपयोग किया जाता है , @ चिह्न एक प्लेसहोल्डर है जो किसी भी स्ट्रिंग द्वारा प्रतिस्थापित किया जा सकता है।

sed -i : फ़ाइलों को बिना बैकअप के , जगह में संपादित करें ।
एसईडी एस / regexp / प्रतिस्थापन / : स्थानापन्न स्ट्रिंग मिलान regexp साथ प्रतिस्थापन
sed s / regexp / प्रतिस्थापन / g : वैश्विक , केवल पहले मैच के बजाय प्रत्येक मैच के लिए प्रतिस्थापन बनाते हैं।


13
यह मेरे लिए काम नहीं किया, लेकिन यह किया:grep --include={*.php,*.html,*.js} -rnl './' -e "old-word" | xargs -i@ sed -i 's/old-word/new-word/g' @
डेनिस

7
@pymarco क्या आप इस आदेश की व्याख्या कर सकते हैं? मुझे नहीं पता कि आपको सिर्फ़ सेड का इस्तेमाल करने के बजाय ज़ारगेट्स का इस्तेमाल क्यों करना पड़ा |, इसके अलावा, -iज़र्ग्स कमांड में क्यों ? मैं मैनुअल में पढ़ा जाता हूं यह पदावनत है और -Iइसके बजाय उपयोग करना चाहिए । और @पैटर्न के लिए शुरुआत और अंत के लिए एक सीमांकक के रूप में उपयोग किया जाता है?
एडसन होरासियो जूनियर

2
प्रश्न विशेष रूप से लिनक्स के लिए है।
pymarco

6
ऑक्स पर यह ठीक है:grep -rli 'old-word' * | xargs -I@ sed -i '' 's/2.0.0/latest/g' @
फिलिप सुल्तान

1
यह अच्छा होगा यदि आप कुछ विकल्पों को तोड़ दें ( rli) और @उदाहरण के लिए संकेत
रॉयमुन्सन

37

यह मेरे लिए काम किया:

find ./ -type f -exec sed -i 's/string1/string2/' {} \;

हॉवरवर, यह नहीं किया sed -i 's/string1/string2/g' *:। शायद "फू" का अर्थ स्ट्रिंग 1 नहीं था और "बार" स्ट्रिंग 2 नहीं था।


1
ऐसा इसलिए है क्योंकि sed वाइल्डकार्ड * को अलग तरह से मानते हैं। [abc] * का अर्थ है सेट के वर्णों की एक मनमानी संख्या {a, b, c}। [a-z0-9] * वाइल्डकार्ड के समान काम करता है *।
thepiercingarrow

8
OSX उपयोग पर:find ./ -type f -exec sed -i '' -e 's/string1/string2/' {} \;
शाहीन घिसे

32

पहले से सूचीबद्ध इस के लिए कुछ मानक उत्तर हैं। आम तौर पर, आप फ़ाइलों को पुनरावर्ती रूप से सूचीबद्ध करने के लिए खोज का उपयोग कर सकते हैं और फिर sed या पर्ल के साथ संचालन कर सकते हैं ।

अधिकांश त्वरित उपयोगों के लिए, आप पा सकते हैं कमांड आरपीएल याद रखना बहुत आसान है। यहाँ प्रतिस्थापन है (फू -> बार), सभी फ़ाइलों पर पुनरावर्ती:

rpl -R foo bar .

आपको शायद इसे ( apt-get install rplया समान) स्थापित करने की आवश्यकता होगी ।

हालाँकि, कठिन नौकरियों के लिए जिनमें नियमित अभिव्यक्ति और बैक प्रतिस्थापन शामिल हैं, या नाम बदलने के साथ-साथ खोज-और-फ़ाइल भी दर्ज करते हैं, सबसे सामान्य और शक्तिशाली उपकरण जिसके बारे में मुझे पता है, वह रीप्रैन है , एक छोटा पायथन स्क्रिप्ट जिसे मैंने कुछ समय पहले लिखा था कांटेदार नामकरण और कार्य को फिर से शुरू करना। आप इसे पसंद कर सकते हैं कारण हैं:

  • फ़ाइल का नाम बदलने के साथ-साथ फ़ाइल सामग्री पर खोज-और-बदलें का समर्थन करें।
  • खोज करने और बदलने के लिए प्रतिबद्ध होने से पहले परिवर्तन देखें।
  • बैक प्रतिस्थापन, पूरे शब्द, केस असंवेदनशील और केस प्रोटेक्टिंग (foo -> बार, फू -> बार, FOO -> BAR) मोड के साथ नियमित अभिव्यक्ति का समर्थन करें।
  • कई प्रतिस्थापनों के साथ काम करता है, जिसमें स्वैप (foo -> बार और बार -> foo) या गैर-विशिष्ट प्रतिस्थापन के सेट (foo -> बार, f -> x) शामिल हैं।

इसके इस्तेमाल के लिये pip install repren। उदाहरणों के लिए README की जाँच करें


1
वाह, repren उत्कृष्ट है! 1,000+ सी ++ हेडर और स्रोत फ़ाइलों में मेल करने के लिए फ़ाइलों का नाम बदलने के दौरान बस नाम, विधियों और चर के अंदर एक शब्द का हिस्सा बदलने के लिए इसका इस्तेमाल किया और यह पूरी तरह से पहली बार एक कमांड के साथ काम किया। धन्यवाद!
बॉब कोकिस्को

29

एक स्ट्रिंग को कई फ़ाइलों में बदलने के लिए जिसका आप उपयोग कर सकते हैं:

grep -rl string1 somedir/ | xargs sed -i 's/string1/string2/g'

उदाहरण के लिए

grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'

स्रोत ब्लॉग


20

फ़ाइलों के भीतर एक पथ को बदलने के लिए (भागने के पात्रों से बचने के लिए) आप निम्न आदेश का उपयोग कर सकते हैं:

sed -i 's@old_path@new_path@g'

@ चिह्न का मतलब है कि सभी विशेष वर्णों को निम्नलिखित स्ट्रिंग में अनदेखा किया जाना चाहिए।


2
बिल्कुल वही जो मैं अन्य सभी उत्तरों में ढूंढ रहा था। अर्थात्, विशेष वर्णों से कैसे निपटें, जैसे कि एक स्ट्रिंग को बदलते समय जो एक रास्ता है। धन्यवाद। अन्य उत्तरों में एक बड़े निरीक्षण की तरह देखा गया।
प्रेरित

19

यदि आपकी स्ट्रिंग में आगे स्लैश (/) है, तो आप सीमांकक को '+' में बदल सकते हैं।

find . -type f -exec sed -i 's+http://example.com+https://example.com+g' {} +

यह आदेश वर्तमान निर्देशिका में पुनरावर्ती रूप से चलेगा।


धन्यवाद! परिवर्तन की संदर्भ की एक लोड मदद ../domain.comकरने के लिएdomain.com
जैक रोजर्स

12

"फू" की पहली पंक्ति की घटनाओं को "बार" से बदल दिया जाएगा। और आप दूसरी लाइन का उपयोग करके जांच कर सकते हैं।

grep -rl 'foo' . | xargs sed -i 's/foo/bar/g'
grep 'foo' -r * | awk -F: {'print $1'} | sort -n | uniq -c

6
आप अपने ब्लॉग से क्यों जुड़ रहे हैं? इसमें ठीक वैसा ही पाठ है जैसा आपका उत्तर है।
डेविडपोस्टिल

1
मुझे पसंद हैgrep -rl 'foo' . | xargs sed -i 's/foo/bar/g'
प्राची

10

यदि आपके पास उन फ़ाइलों की सूची है जिनका आप उपयोग कर सकते हैं

replace "old_string" "new_string" -- file_name1 file_name2 file_name3

यदि आपके पास सभी फाइलें हैं तो आप उपयोग कर सकते हैं

replace "old_string" "new_string" -- *

यदि आपके पास एक्सटेंशन वाली फ़ाइलों की सूची है, तो आप उपयोग कर सकते हैं

replace "old_string" "new_string" -- *.extension

2
वास्तव में, "- फ़िले" बस "-" होना चाहिए, कम से कम मेरे संस्करण में
सरल

4
यह उपयोगिता MySQL संकुल के भीतर वितरित की जाती है।
दिमित्री गिंजबर्ग

2
हालांकि मैं समाधान की सराहना करना चाहूंगा, जो नियमित अभिव्यक्ति के लिए नियमित लाइन को उद्धृत किए बिना काम करता है।
दिमित्री गिंजबर्ग

1
यह ठीक काम करता है - और यदि आप सभी स्ट्रिंग्स को कई फाइलों में बदलना चाहते हैं, जो कि ".txt" में समाप्त होती हैं, तो आप बस कर सकते हैंreplace "old_string" "new_string" -- *.txt
tsveti_iko

1
इस replaceउपयोगिता को प्राप्त करने के लिए इसे जोड़ना बेहतर है । इस जानकारी के बिना, यह उत्तर अधूरा है।
सीतेश

7

"आप फाइंड और सेड का भी उपयोग कर सकते हैं, लेकिन मुझे लगता है कि पर्ल की यह छोटी लाइन अच्छी तरह से काम करती है।

perl -pi -w -e 's/search/replace/g;' *.php
  • -इसका मतलब कोड की निम्नलिखित लाइन को निष्पादित करना है।
  • -आई का मतलब है जगह-जगह संपादित करना
  • -साथ में चेतावनी लिखिए
  • -पी लूप

"( Http://www.liamdelahunty.com/tips/linux_search_and_replace_multiple_files.php से निकाला गया )

मेरे सर्वोत्तम परिणाम पर्ल और grep का उपयोग करने से आते हैं (यह सुनिश्चित करने के लिए कि फ़ाइल में खोज अभिव्यक्ति है)

perl -pi -w -e 's/search/replace/g;' $( grep -rl 'search' )

7

यह देखते हुए कि आप स्ट्रिंग की खोज करना चाहते हैं searchऔर इसे replaceकई फाइलों के साथ बदलना चाहते हैं , यह मेरा युद्ध-परीक्षण, एक-पंक्ति सूत्र है :

grep -RiIl 'search' | xargs sed -i 's/search/replace/g'

त्वरित संक्षिप्त विवरण:

  • -R - पुनरावर्ती खोज
  • -i - असंवेदनशील मामला
  • -I - बाइनरी फ़ाइलें छोड़ें (आप पाठ चाहते हैं, ठीक है?)
  • -l- आउटपुट के रूप में एक साधारण सूची प्रिंट करें। अन्य आज्ञाओं की आवश्यकता है

फिर grep आउटपुट को sed (xargs के माध्यम से) पाइप किया जाता है, जिसका उपयोग वास्तव में टेक्स्ट को बदलने के लिए किया जाता है। -iझंडा सीधे फ़ाइल को बदल देगा। इसे "ड्राई रन" मोड के लिए निकालें।


4

इससे पहले कि मैं यह सवाल (और जवाब) पाता मैं अपना समाधान खुद कर लेता। मैंने "बदलें" "कई" और "xml" के विभिन्न संयोजनों की खोज की, क्योंकि यह मेरा आवेदन था, लेकिन यह विशेष नहीं मिला।

मेरी समस्या: मेरे पास परीक्षण के मामलों के लिए डेटा के साथ स्प्रिंग एक्सएमएल फाइलें थीं, जिनमें जटिल वस्तुएं थीं। जावा स्रोत कोड पर एक रिफ्लेक्टर ने बहुत सारी कक्षाएं बदल दीं और xml डेटा फ़ाइलों पर लागू नहीं हुईं। परीक्षण मामलों के डेटा को बचाने के लिए, मुझे कई निर्देशिकाओं में वितरित सभी xml फ़ाइलों में सभी वर्ग नामों को बदलने की आवश्यकता है। सभी मूल xml फ़ाइलों की बैकअप प्रतियों को सहेजते समय (हालांकि यह बहुत जरूरी नहीं था, क्योंकि संस्करण नियंत्रण मुझे यहां बचाएगा)।

मुझे find+ के कुछ संयोजन की तलाश थी sed, क्योंकि यह मेरे लिए अन्य स्थितियों में काम करता था, लेकिन एक साथ कई प्रतिस्थापनों के साथ नहीं।

तब मुझे ubuntu प्रतिक्रिया पूछने में मदद मिली और इसने मुझे अपनी कमांड लाइन बनाने में मदद की:

find -name "*.xml" -exec sed -s --in-place=.bak -e 's/firstWord/newFirstWord/g;s/secondWord/newSecondWord/g;s/thirdWord/newThirdWord/g' {} \;

और इसने पूरी तरह से काम किया (ठीक है, मेरे मामले में छह अलग-अलग प्रतिस्थापन थे)। लेकिन कृपया ध्यान दें कि यह वर्तमान निर्देशिका के तहत सभी * .xml फ़ाइलों को स्पर्श करेगा। उसके कारण, और यदि आप एक संस्करण नियंत्रण प्रणाली के प्रति जवाबदेह हैं, तो आप पहले फ़िल्टर करना चाहते हैं और केवल sedउन पर पास करना चाहते हैं जो वास्तव में आप चाहते हैं; पसंद:

find -name "*.xml" -exec grep -e "firstWord" -e "secondWord" -e "thirdWord" {} \; -exec sed -s --in-place=.bak -e 's/firstWord/newFirstWord/g;s/secondWord/newSecondWord/g;s/thirdWord/newThirdWord/g' {} \;

और खिड़कियों के लिए, मुझे अभी पता चला है कि स्ट्रिंग को खोजने का एक तरीका है - अभी तक यह जांचना नहीं है कि इसे कैसे बदला जाए - एक कमांड में: findstr /spin /c:"quéquieresbuscar" *.xml यह आसान होगा।
मैनुएलविर्जिया


3

वास्तव में लंगड़ा, लेकिन मुझे OSX पर सही काम करने के लिए कोई भी सीड कमांड नहीं मिल सका, इसलिए मैंने इसके बजाय यह गूंगा काम किया:

:%s/foo/bar/g
:wn

^ - मेरे क्लिपबोर्ड में इन तीन पंक्तियों को कॉपी करें (हां, समाप्त होने वाली न्यूलाइन शामिल करें), फिर:

vi *

और कमांड-वी को तब तक दबाए रखें जब तक यह न कहे कि कोई फाइल नहीं बची है।

बेवकूफ ... hacky ... प्रभावी ...


3

मैकबुक प्रो पर, मैंने निम्नलिखित का उपयोग किया ( https://stackoverflow.com/a/19457213/6169225 से प्रेरित ):

sed -i '' -e 's/<STR_TO_REPLACE>/<REPLACEMENT_STR>/g' *

-i '' यह सुनिश्चित करेगा कि आप कोई बैकअप नहीं ले रहे हैं।

-e आधुनिक रेगेक्स के लिए।


3
-eबस sed को बताता है कि अगला टोकन एक कमांड है। विस्तारित नियमित अभिव्यक्तियों के लिए, -Eइसके बजाय उपयोग करें ।
बेंजामिन डब्ल्यू

2

स्ट्रीम के -iस्विच के साथ आने पर स्ट्रीम एडिटर कई फाइलों को "इनहेल्ड" कर देता है , जो कि तर्क के रूप में समाप्त होने वाली बैकअप फाइल लेता है। इसलिए

sed -i.bak 's/foo/bar/g' *

इस फ़ोल्डर में सभी फ़ाइलों के fooसाथ बदलता है bar, लेकिन सबफ़ोल्डर में नहीं उतरता है। हालाँकि यह .bakआपकी निर्देशिका में प्रत्येक फ़ाइल के लिए एक नई फ़ाइल उत्पन्न करेगा । इस निर्देशिका और इसकी सभी उपनिर्देशिकाओं की सभी फ़ाइलों के लिए पुनरावर्ती रूप से ऐसा करने के लिए, आपको findनिर्देशिका ट्री को पार करने के लिए एक सहायक की आवश्यकता होती है ।

find ./ -print0 | xargs -0 sed -i.bak 's/foo/bar/g' *

findfind ./ -name '*.php' -or -name '*.html' -print0यदि आवश्यक हो, तो आगे की दलीलें निर्दिष्ट करके, आपको क्या फ़ाइलों को संशोधित करने की अनुमति देता है।


नोट: जीएनयू sedको फ़ाइल समाप्त होने की आवश्यकता नहीं है sed -i 's/foo/bar/g' *, साथ ही काम करेगा; FreeBSD sedएक विस्तार की मांग करता है, लेकिन बीच में एक जगह की अनुमति देता है, इसलिए sed -i .bak s/foo/bar/g *काम करता है।


2

मल्टीडेट कमांड के लिए स्क्रिप्ट

multiedit [-n PATTERN] OLDSTRING NEWSTRING

कास्पर के जवाब से मैंने कमांड लाइन के तर्क को स्वीकार करने के लिए एक बैश स्क्रिप्ट बनाई और वैकल्पिक रूप से पैटर्न से मेल खाने वाले फ़ाइलनाम को सीमित किया। अपने $ पेट में सहेजें और निष्पादन योग्य बनाएं, फिर ऊपर दिए गए कमांड का उपयोग करें।

यहाँ स्क्रिप्ट है:

#!/bin/bash
_help="\n
Replace OLDSTRING with NEWSTRING recursively starting from current directory\n
multiedit [-n PATTERN] OLDSTRING NEWSTRING\n

[-n PATTERN] option limits to filenames matching PATTERN\n
Note: backslash escape special characters\n
Note: enclose STRINGS with spaces in double quotes\n
Example to limit the edit to python files:\n
multiedit -n \*.py \"OLD STRING\" NEWSTRING\n"

# ensure correct number of arguments, otherwise display help...
if [ $# -lt 2 ] || [ $# -gt 4 ]; then echo -e $_help ; exit ; fi
if [ $1 == "-n" ]; then  # if -n option is given:
        # replace OLDSTRING with NEWSTRING recursively in files matching PATTERN
        find ./ -type f -name "$2" -exec sed -i "s/$3/$4/g" {} \;
else
        # replace OLDSTRING with NEWSTRING recursively in all files
        find ./ -type f -exec sed -i "s/$1/$2/" {} \;
fi

1

यदि फ़ाइल में बैकस्लैश हैं (आमतौर पर पथ) तो आप कुछ इस तरह की कोशिश कर सकते हैं:

sed -i -- 's,<path1>,<path2>,g' *

उदाहरण के लिए:

sed -i -- 's,/foo/bar,/new/foo/bar,g' *.sh (in all shell scripts available)

1

अपनी व्यक्तिगत अंग्रेजी नोड को बनाए रखने के लिए, मैंने एक उपयोगिता स्क्रिप्ट लिखी जो किसी निर्देशिका के तहत सभी फाइलों के लिए पुरानी / नई स्ट्रिंग के कई जोड़े को बदलने में मदद करती है।

पुराने / नए स्ट्रिंग की कई जोड़ी को हैश मैप में प्रबंधित किया जाता है।

डायर को कमांड लाइन या पर्यावरण चर के माध्यम से सेट किया जा सकता है, मानचित्र को स्क्रिप्ट में कठिन कोडित किया गया है, लेकिन यदि आवश्यक हो, तो आप फ़ाइल से लोड करने के लिए कोड को संशोधित कर सकते हैं।

कुछ नए फीचर के कारण इसे bash 4.2 की आवश्यकता है।

en_standardize.sh:

#! /bin/bash
# (need bash 4.2+,)
# 
# Standardize phonetic symbol of English.
# 
# format:
#   en_standardize.sh [<dir>]
# 
# params:
# * dir
#   target dir, optional,
#   if not specified then use environment variable "$node_dir_en",
#   if both not provided, then will not execute,
# * 
# 

paramCount=$#

# figure target dir,
if [ $paramCount -ge 1 ]; then # dir specified
    echo -e "dir specified (in command):\n\t$1\n"
    targetDir=$1
elif [[ -v node_dir_en ]]; then # environable set,
    echo -e "dir specified (in environment vairable):\n\t$node_dir_en\n"
    targetDir=$node_dir_en
else # environable not set,
    echo "dir not specified, won't execute"
    exit
fi

# check whether dir exists,
if [ -d $targetDir ]; then
    cd $targetDir
else
    echo -e "invalid dir location:\n\t$targetDir\n"
    exit
fi

# initial map,
declare -A itemMap
itemMap=( ["ɪ"]="i" ["ː"]=":" ["ɜ"]="ə" ["ɒ"]="ɔ" ["ʊ"]="u" ["ɛ"]="e")

# print item maps,
echo 'maps:'
for key in "${!itemMap[@]}"; do
    echo -e "\t$key\t->\t${itemMap[$key]}"
done
echo -e '\n'

# do replace,
for key in "${!itemMap[@]}"; do
    grep -rli "$key" * | xargs -i@ sed -i "s/$key/${itemMap[$key]}/g" @
done

echo -e "\nDone."
exit

1

Ack कमांड का प्रयोग इस तरह तेजी से होगा:

ack '25 Essex' -l | xargs sed -i 's/The\ fox \jump/abc 321/g'

इसके अलावा यदि आपके पास खोज परिणाम में एक सफेद स्थान है। आपको इससे बचने की जरूरत है।


0

मैं अजगर स्रोतों में एक सामान्य शेबंग त्रुटि को ठीक करने के लिए एक उदाहरण दे रहा हूं।

आप grep / sed दृष्टिकोण की कोशिश कर सकते हैं। यहाँ एक है जो GNU sed के साथ काम करता है और एक git रेपो को नहीं तोड़ेगा:

$ grep -rli --exclude '*.git*' '#!/usr/bin/python' . | xargs -I {} \
gsed -i '' -e 's/#!\/usr\/bin\/python/#!\/usr\/bin\/env python/' {}

या आप greptile का उपयोग कर सकते हैं :)

$ greptile -x .py -l -i -g '#!/usr/bin/env python' -r '#!/usr/bin/python' .

मैंने सिर्फ पहली स्क्रिप्ट का परीक्षण किया, और दूसरे को भी काम करना चाहिए। भागने के पात्रों के साथ सावधान रहें, मुझे लगता है कि ज्यादातर मामलों में ग्रेप्टाइल का उपयोग करना आसान होना चाहिए। बेशक, आप बहुत सी दिलचस्प चीजें सेड के साथ कर सकते हैं, और इसके लिए इसे xargs के साथ मास्टर करना बेहतर हो सकता है।


0

मैंने इसे एक अन्य पोस्ट से पाया (जो याद नहीं कर सकता) और सबसे सुरुचिपूर्ण नहीं होने के बावजूद, यह सरल है और नौसिखिया के रूप में लिनक्स उपयोगकर्ता ने मुझे कोई परेशानी नहीं दी है

for i in *old_str* ; do mv -v "$i" "${i/\old_str/new_str}" ; done

यदि आपके पास रिक्त स्थान हैं या अन्य विशेष वर्ण a का उपयोग करते हैं

for i in *old_str\ * ; do mv -v "$i" "${i/\old_str\ /new_str}" ; done

उप-निर्देशिकाओं में तार के लिए **

for i in *\*old_str\ * ; do mv -v "$i" "${i/\old_str\ /new_str}" ; done

0

नीचे दिए गए कमांड का उपयोग पहले फाइलों को खोजने और फाइलों को बदलने के लिए किया जा सकता है:

find . | xargs grep 'search string' | sed 's/search string/new string/g'

उदाहरण के लिए

find . | xargs grep abc | sed 's/abc/xyz/g'

0

एक सरल स्क्रिप्ट फ़ाइल का उपयोग करके एक आसान तरीका है:

   # sudo chmod +x /bin/replace_string_files_present_dir

फ़ाइल को gedit में खोलें या अपनी पसंद के संपादक के लिए, मैं यहाँ gedit का उपयोग करता हूँ।

   # sudo gedit /bin/replace_string_files_present_dir

फिर संपादक में फ़ाइल में निम्नलिखित पेस्ट करें

   #!/bin/bash
   replace "oldstring" "newstring" -- *
   replace "oldstring1" "newstring2" -- *
   #add as many lines of replace as there are your strings to be replaced for 
   #example here i have two sets of strings to replace which are oldstring and 
   #oldstring1 so I use two replace lines.

फ़ाइल सहेजें, gedit बंद करें , फिर अपने टर्मिनल से बाहर निकलें या बस इसे बंद करें और फिर इसे अपने द्वारा जोड़े गए नई स्क्रिप्ट को लोड करने में सक्षम होने के लिए शुरू करें।

उस निर्देशिका पर नेविगेट करें जहां आपके पास कई फाइलें हैं जिन्हें आप संपादित करना चाहते हैं। फिर भागो:

  #replace_string_files_present_dir

प्रेस दर्ज करें और यह स्वचालित रूप से सभी फाइलों में पुरानेस्ट्रिंग और पुरानेस्ट्रिंग 1 को बदल देगा , जिनमें क्रमशः सही न्यूस्ट्रिंग और न्यूस्ट्रिंग 1 शामिल हैं।

यह उन सभी निर्देशिकाओं और फ़ाइलों को छोड़ देगा जिनमें पुराने तार नहीं हैं।

यह उन मामलों में टाइपिंग के थकाऊ काम को खत्म करने में मदद कर सकता है जब आपके पास कई निर्देशिकाएं होती हैं जिनमें स्ट्रिंग प्रतिस्थापन की आवश्यकता होती है। आपको बस उन निर्देशिकाओं में से प्रत्येक पर नेविगेट करना है, फिर चलाएं:

#replace_string_files_present_dir

आपको केवल यह सुनिश्चित करना है कि आपने सभी प्रतिस्थापन स्ट्रिंग्स को शामिल किया है या जोड़ा है जैसा कि मैंने आपको ऊपर दिखाया है:

replace "oldstring" "newstring" -- *

फ़ाइल के अंत में / बिन / प्रतिस्थापित_string_files_pret_dir

टर्मिनल में निम्नलिखित टाइप करके हमारे द्वारा बनाई गई स्क्रिप्ट को खोलने के लिए एक नया प्रतिस्थापित स्ट्रिंग जोड़ने के लिए:

sudo gedit /bin/replace_string_files_present_dir

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


आम तौर पर, जब लोग पूछते हैं कि "कैसे $ {जो कुछ भी" हो जाए, "उन्हें एक स्क्रिप्ट या CI जॉब्स इंस्ट्रक्शन (एक .gitlab-ci.ymlया एक a travis.yml) कहते हैं । बाद में इसे अंजाम देने के लिए एक स्क्रिप्ट लिखने में शामिल हर मोड़ एक विरोधी पैटर्न है, क्योंकि आपको फिर स्क्रिप्ट निर्माण की स्क्रिप्ट की आवश्यकता होगी (और मैं गन्दा हो जाता हूं, ज्यादातर समय)
zar3bski

-4

$ "से" "से" की जगह - `खोजें / पथ / से / फ़ोल्डर-प्रकार f`

(बदलें - MySQL डाटाबेस सिस्टम की एक स्ट्रिंग-प्रतिस्थापन उपयोगिता)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.