आप एक छोटी सी पर्ल स्क्रिप्ट के साथ कुछ क्रूड कर सकते हैं, जिसे -l -pe
तर्क ( -i
) के रूप में पास की गई फ़ाइलों के स्थान पर लाइन ( ) द्वारा रिप्लेसमेंट लाइन करने का निर्देश दिया गया है :
perl -i -l -pe '
if (/from/) { # is the source text present on this line?
printf STDERR ("%s: %s [y/N]? ", $ARGV, $_); # display a prompt
$r=<STDIN>; # read user response
if ($r =~ /^[Yy]/) { # if user entered Y:
s/from/to/g; # replace all occurences on this line
}' /path/to/files
संभावित सुधार, प्रॉम्प्ट के कुछ हिस्सों को रंगने और "वर्तमान फ़ाइल में सभी आवृत्तियों को प्रतिस्थापित करने" जैसी चीजों का समर्थन करने के लिए होगा। एक पंक्ति में प्रत्येक घटना के लिए अलग-अलग संकेत देना कठिन होगा।
दूसरा भाग, फाइलों का मिलान। यदि बहुत अधिक फाइलें शामिल नहीं हैं और आप zsh चला रहे हैं, तो आप वर्तमान निर्देशिका की सभी फाइलों और उसकी उपनिर्देशिकाओं की पुनरावृत्ति से मिलान कर सकते हैं:
perl -i -l -pe '…' **/*(.)
यदि आपका खोल bash ,4 है, तो आप चला सकते हैं perl … **/*
, लेकिन यह बहुत ही त्रुटिपूर्ण त्रुटि संदेश उत्पन्न करेगा क्योंकि sed निर्देशिकाओं पर चलने की कोशिश करेगा (और विफल)। यदि आप केवल फ़ाइलों के एक सेट में प्रतिस्थापन करना चाहते हैं जैसे कि सी फ़ाइलें, तो आप मैचों को प्रतिबंधित कर सकते हैं (जो या तो बैश ≥4 या zsh में काम करता है):
perl -i -l -pe '…' **/*.[hc]
यदि आपको बेहतर नियंत्रण की आवश्यकता है कि आप किन फ़ाइलों की जगह ले रहे हैं, या आपके शेल में पुनरावर्ती निर्देशिका मिलान निर्माण नहीं है **
, या यदि आपके पास बहुत अधिक फाइलें हैं और "कमांड लाइन बहुत लंबी" त्रुटि मिलती है, तो उपयोग करें find
। उदाहरण के लिए, नामांकित *.h
या *.c
वर्तमान निर्देशिका में सभी फ़ाइलों और इसके उपनिर्देशिकाओं पर प्रतिस्थापन करने के लिए (पुराने सिस्टम पर, आपको पंक्ति के अंत में उपयोग \;
करने की आवश्यकता हो सकती है +
( +
फ़ॉर्म तेज़ है लेकिन हर जगह उपलब्ध नहीं है)।
find . -type f -name '*.[hc]' -exec perl -i -l -pe '…' {} +
कहा जा रहा है, अगर आप बातचीत की जरूरत है मैं एक इंटरैक्टिव संपादक से चिपके रहेंगे। गर्ट ने विम में इसके लिए एक रास्ता दिखाया है , हालांकि इसके लिए उन सभी फाइलों को खोलने की आवश्यकता होती है, जिन्हें आप खोजना चाहते हैं, जो बहुत कुछ होने पर एक समस्या हो सकती है।
Emacs में, यहां बताया गया है कि आप यह कैसे कर सकते हैं:
- फ़ाइल नामों के साथ इकट्ठा करें
M-x find-name-dired
(एक toplevel निर्देशिका M-x find-dired
निर्दिष्ट करें ) या (एक मनमाना find
कमांड लाइन निर्दिष्ट करें )।
- परिणामी बिंदीदार बफ़र में,
t
सभी फ़ाइलों को चिह्नित करने के लिए दबाएँ , फिर Q
( dired-do-query-replace-regexp
) चिह्नित फ़ाइलों पर संकेत देने के साथ प्रतिस्थापन करने के लिए।
s/from/to/g
एक प्रारूपण के साथ पढ़ा होगा, उसके बाद एक स्वरूपित गड़बड़ के बजायs/from/to/gc
जिसc
पर आप लिखने का प्रयास करेंगे (आप मार्कडाउन के साथ ऐसा नहीं कर सकते, आप इसे कर सकते हैं<code>
और<strong>
HTML टैग्स)।