Windows कमांड-लाइन वातावरण का उपयोग करके आप किसी फ़ाइल में टेक्स्ट को कैसे ढूंढ और बदल सकते हैं?


492

मैं विंडोज़ कमांड-लाइन वातावरण का उपयोग करके एक बैच फ़ाइल स्क्रिप्ट लिख रहा हूं और एक फ़ाइल में कुछ पाठ की प्रत्येक घटना को बदलना चाहता हूं (उदा। "FOO") दूसरे के साथ (उदा। "BAR")। ऐसा करने का सबसे सरल तरीका क्या है? किसी भी कार्य में बनाया?



इसका प्रयोग करें:echo(%text:%search%=%replace%%)
वैज्ञानिक_7

जवाबों:


308

यहाँ बहुत से जवाबों ने मुझे सही दिशा में लाने में मदद की, हालाँकि कोई भी मेरे लिए उपयुक्त नहीं था, इसलिए मैं अपना समाधान पोस्ट कर रहा हूँ।

मेरे पास विंडोज 7 है, जो पॉवरशेल बिल्ट-इन के साथ आता है। यहाँ वह स्क्रिप्ट है जिसका उपयोग मैंने किसी फ़ाइल में पाठ के सभी उदाहरणों को खोजने / बदलने के लिए किया है:

powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt"

इसे समझाने के लिए:

  • powershell Windows 7 में शामिल पॉवरशेल ..exe शुरू करता है
  • -Command "... " चलाने के लिए कमांड युक्त powerhell.exe के लिए एक कमांड लाइन arg है
  • (gc myFile.txt)की सामग्री पढ़ता है myFile.txt( कमांड के gcलिए कम है Get-Content)
  • -replace 'foo', 'bar'बस के fooसाथ बदलने के लिए प्रतिस्थापित कमांड चलाता हैbar
  • | Out-File myFile.txt फ़ाइल में आउटपुट को पाइप करता है myFile.txt
  • -encoding ASCII टिप्पणियों को इंगित करने के लिए, आउटपुट फ़ाइल को यूनीकोड ​​में ट्रांसक्रिप्ट करने से रोकता है

Powershell.exe आपके पैट स्टेटमेंट का हिस्सा पहले से ही होना चाहिए, लेकिन यदि आप इसे जोड़ नहीं सकते हैं। मेरी मशीन पर इसका स्थान हैC:\WINDOWS\system32\WindowsPowerShell\v1.0


71
खबरदार, यह कमांड फाइल को यूनिकोड एन्कोडिंग में भी ट्रांसकोड कर सकती है। आप मैन्युअल रूप से जोड़कर एन्कोडिंग निर्दिष्ट कर सकते हैं -encoding ASCIIया UTF8या जो कुछ भी जरूरत है। इसके अलावा, सावधान रहें, यदि आप UTF8 को लक्षित करते हैं, तो यह उस फ़ाइल की शुरुआत में एक बाइट ऑर्डर मार्क पेश कर सकता है जो मूल में प्रकट नहीं हुआ था।
व्यिक

78
@ मुझे यह पता लगाने में कुछ समय लगा कि मुझे कहाँ रखा गया है -encoding ASCII। भविष्य में इसकी आवश्यकता किसी के लिए, यह होगीOut-File -encoding ASCII myFile.txt
rwilson04

15
केवल एक चीज जो मुझे बदलनी थी वह थी Set-Contentइसके बजाय उपयोग करना Out-File
कर्त्जामार्क

6
यह काम करता है, लेकिन फ़ाइलों की एक छोटी सूची पर भी प्रदर्शन भयानक है।
jsuddsjr

23
खबरदार कि प्रतिस्थापित टोकन (इस मामले में 'फू') को एक नियमित अभिव्यक्ति के रूप में माना जाता है। यदि आपके पास कोई विशेष चरित्र है (मेरे पास [] था), तो आपको उन्हें एक (बैकस्लैश) के साथ प्रस्तुत करने की आवश्यकता है।
JW

183

यदि आप .net 2.0 का समर्थन करने वाले विंडोज संस्करण पर हैं, तो मैं आपके शेल को बदल दूंगा। PowerShell आपको कमांड लाइन से .Net की पूरी शक्ति देता है। इसमें कई कमांडलेट भी बनाए गए हैं। नीचे दिए गए उदाहरण से आपका प्रश्न हल हो जाएगा। मैं कमांड के पूर्ण नामों का उपयोग कर रहा हूं, छोटे उपनाम हैं, लेकिन यह आपको Google के लिए कुछ देता है।

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt

10
मैं देख सकता हूँ कि PowerShell इस संग्रह में सक्षम है। लेकिन मैं इसे एक बैच फ़ाइल से कैसे चला सकता हूं (उदाहरण: myProc.bat)?
पाब्लो वेन्टुरिनो

3
@ पाब्लो, पॉवर्सशेल। Exe का प्रयोग करें और ps कमांड को सिंगल पैरामीटर में लपेटें
lubos hasko

56
-1 .. निश्चित रूप से उत्तर स्वीकार कर लिया गया था, लेकिन यह निर्दिष्ट प्रश्न का उत्तर नहीं है।
baash05

28
यदि आप एक ही फ़ाइल में सहेजते हैं तो यह उपयोग त्रुटि में एक फ़ाइल के साथ विफल हो जाएगा। आपको पॉवरशेल कमांड को बदलने की जरूरत है: (Get-Content test.txt) | ForEach-Object {$ _ -replace "foo", "bar"} | सेट-कंटेंट test.txt
BigMomma

6
@Rachel से उत्तर देखें:powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
निगेल टच

161

बस FART (" F ind A nd R eplace T ext" कमांड लाइन उपयोगिता) का उपयोग किया जाता है:
फ़ाइलों के एक बड़े सेट के भीतर पाठ प्रतिस्थापन के लिए उत्कृष्ट थोड़ा फ्रीवेयर।

SourceForge पर सेटअप फाइलें हैं

उपयोग उदाहरण:

fart.exe -p -r -c -- C:\tools\perl-5.8.9\* @@APP_DIR@@ C:\tools

इस पर्ल वितरण की फ़ाइलों में पुनरावृत्ति करने के लिए प्रतिस्थापन का पूर्वावलोकन करेगा।

केवल समस्या: FART वेबसाइट आइकन बिल्कुल स्वादिष्ट, परिष्कृत या सुरुचिपूर्ण नहीं है;)


अद्यतन 2017 (7 साल बाद) jagb बाहर अंक टिप्पणी में 2011 लेख के लिए " आसान तरीका farting - टेक्स्ट ढूंढना और बदलना " से Mikail Tunç


19
शांत बात यह है कि यह एक एकल निर्वासित है। कोई निर्भरता नहीं। कोई छोटा प्रिंट नहीं। सुपर आसान तैनात करने के लिए।
सर्ग वॉटियर

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

4
धन्यवाद, यह एकदम सही है, मानक डॉस टूल का हिस्सा होना चाहिए और एक आकर्षण काम करना चाहिए। -P विकल्प हालांकि आपको यह नहीं दिखाता है कि यह कितने बदलाव करेगा 'और बना देगा और हमेशा रिपोर्ट करता है 0 जो मुझे कुछ
मिनटों के

3
मैं समझता हूं कि यह एक बहुत पुराना प्रश्न है लेकिन मुझे अधिक जानकारी मिली और आशा है कि यह स्टैक ओवरफ्लो उपयोगकर्ताओं के लिए उपयोगी होगा। FART के लिए एक और लिंक जहां उत्पाद अच्छी तरह से समझाया गया है: FART ने @ emtunc.org को समझाया और एक अन्य पेज यहां पाया जा सकता है: FART कृपया प्रतिस्थापन के साथ सावधान रहें /और 'क्योंकि यह हम सभी के लिए काम नहीं कर रहा है , मेरे लिए यह कुछ में काम किया है मामलों लेकिन यह कुछ फाइलों पर काम नहीं किया था और मैं नहीं जानता कि क्यों .. मैं इस प्रयोग किया जाता है अन्य पाठ और एक साथ पाठ बदलने के लिए/
jagb

4
@ जगब धन्यवाद। मैंने अधिक दृश्यता के लिए आपके लिंक को उत्तर में शामिल किया है।
VonC

128

बदलें - स्ट्रिंग प्रतिस्थापन का उपयोग करके एक प्रतिस्थापन को बदलें विवरण: एक स्ट्रिंग को दूसरे स्ट्रिंग के साथ प्रतिस्थापित करने के लिए स्ट्रिंग प्रतिस्थापन सुविधा का उपयोग करें। यहाँ दिखाया गया उदाहरण स्ट्रिंग चर स्ट्रिंग में "" के साथ सभी घटनाओं "तेह" गलत वर्तनी को प्रतिस्थापित करता है।

set str=teh cat in teh hat
echo.%str%
set str=%str:teh=the%
echo.%str%

स्क्रिप्ट आउटपुट:

teh cat in teh hat
the cat in the hat

रेफरी: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace


30
Sed सुझाव बेहतर कैसे है? यह उन सभी का सबसे सरल जवाब लगता है और कुछ भी स्थापित करने की आवश्यकता होती है।

5
क्या यहां किसी तरह का पैटर्न मैच किया जा सकता है? वाइल्डकार्ड्स, रेगेक्स आदि?
कीयो

27
"Sed सुझाव बेहतर कैसे है?" - sed और समान उपयोगिताओं फाइलों पर काम करती हैं; यह स्निपेट इनपुट फ़ाइल से लाइनों को पढ़ने और आउटपुट फ़ाइल में लिखने के महत्वपूर्ण चरण को छोड़ देता है, जबकि यह सुनिश्चित करता है कि फ़ाइल में किसी भी विशेष वर्ण को सही तरीके से संभाला जाए।
जो

7
@ असद, हां यह सच है, ओपी फाइलों के बारे में पूछ रहा था, लेकिन वास्तव में यह उन धाराओं के साथ काम करता है जिनके पास फाइलें होना जरूरी नहीं है। लेकिन मेरा कहना यह है कि यह उत्तर त्रुटिपूर्ण है, क्योंकि यह किसी स्ट्रीम से पढ़ना / लिखना और किसी विशेष वर्ण को संभालना छोड़ देता है।
जो

4
@ किसी पाठ की जगह चर का उपयोग कैसे करें? अर्थात। मेरे पास एक चर और एक स्ट्रिंग में मूल्य है जिसमें कुछ सीमांकक है। सेट str =% str: "##" =% varValue %% काम नहीं करता है। किसी भी काम?
मल्टेक

55

फ़ाइल प्रतिस्थापित करें।

Const ForReading = 1    
Const ForWriting = 2

strFileName = Wscript.Arguments(0)
strOldText = Wscript.Arguments(1)
strNewText = Wscript.Arguments(2)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
strText = objFile.ReadAll
objFile.Close

strNewText = Replace(strText, strOldText, strNewText)
Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.Write strNewText  'WriteLine adds extra CR/LF
objFile.Close

इस संशोधित स्क्रिप्ट का उपयोग करने के लिए (जिसे हम रिप्लेस। Vbs कहेंगे) कमांड प्रॉम्प्ट से इसके समान एक कमांड टाइप करें:

cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "


यह साफ है, क्या यह RegEx के उपयोग की अनुमति देता है?
user280109

3
@ user280109 हाँ, VBScript समर्थन करता है RegExp। आप एक नियमित अभिव्यक्ति का उपयोग करने के लिए इसका उपयोग कर सकते हैं With (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With:। आप का उपयोग कर पहले 9 पर कब्जा समूहों के पाठ प्राप्त कर सकते हैं $1, $2... $9
टूथब्रश

2
VBScript को अक्सर अनदेखा किया जाता है (और नफरत की जाती है), लेकिन सभी विंडोज़ प्लेटफार्मों पर उपलब्ध है, बहुत ही पठनीय है और वास्तव में बहुत शक्तिशाली क्षमताएं +1 हैं
zelanix

1
@ user280109 आपने अभी आदेश दिया है, मुझे क्या चाहिए। लेकिन मैं प्रतिस्थापित करना चाहता हूं (केस-असंवेदनशील) क्या आप इसके लिए कमांड प्रदान कर सकते हैं?
अजमल प्रवीण

49

BatchSubstitute.baton dostips.com एक शुद्ध बैच फ़ाइल का उपयोग करके खोज और बदलने का एक उदाहरण है।

यह का एक संयोजन का उपयोग करता है FOR, FINDऔर CALL SET

इनमें से वर्ण वाली पंक्तियों को "&<>]|^गलत तरीके से माना जा सकता है।



8
मुझे एक कोड स्निपेट साइट की उपयोगिता पर सवाल उठाना होगा, जिसके उपयोग की शर्तें किसी भी कोड को कॉपी करने पर रोक लगाती हैं ("आप डोमेन के लिखित अनुमति के बिना किसी भी रूप में डोमेन dostips.com के तहत प्रदान की गई किसी भी जानकारी को किसी भी रूप में वितरित नहीं कर सकते हैं।" ।
गिलेस एसओ- बुराई को रोकना '

1
मैं मानता हूं कि उनकी शर्तें भ्रामक हैं, वे यह भी कहते हैं "डोमेन dostips.com के तहत प्रदान की गई जानकारी उम्मीद के मुताबिक उपयोगी है" इसलिए मेरी धारणा यह है कि वे किसी समस्या को हल करने के लिए लोगों को कोड कॉपी करने के लिए खुश हैं। मुझे यकीन नहीं है कि मैंने कभी भी किसी भी नियम और शर्तों को पढ़ा है और खुश हूं ...
Morechilli

5
यह भी खूब रही। मुझे ऐसे उत्तर पसंद हैं जिनमें इसे करने के लिए कुछ और डाउनलोड करना शामिल नहीं है।
रुआरी ओ'ब्रायन

मुझे ऐसे समाधान भी पसंद हैं जो बाहरी उपयोगिताओं को शामिल नहीं करते हैं, दुर्भाग्य से, जब मैं इस बैच को चलाने की कोशिश करता हूं, तो मुझे "ढूंढना: अमान्य विधेय पूर्व" मिल जाता है। वास्तव में अभी इसे डिबग करने का समय नहीं है।
जहमीम जूल 27'13

2
"खोज: अमान्य विधेयक '' त्रुटि मेरे सिस्टम पर बाहरी 'खोज' उपयोगिता के कारण थी। एक बार हटा देने के बाद, यह ठीक काम कर गया।
जहमीम जूल

47

नोट - बेहतर JREPL.BAT के लिंक के लिए इस उत्तर के अंत में अपडेट देखना सुनिश्चित करें जो REPL.BAT
JREPL.BAT 7.0 और इसके बाद के संस्करण में यूनिकोड (UTF-16LE) को /UTFविकल्प के माध्यम से समर्थन करता है , साथ ही साथ अन्य वर्ण सेट, सहित UTF-8, ADO के माध्यम से !!!!


मैंने REPL.BAT नामक एक छोटी संकर JScript / बैच उपयोगिता लिखी है जो ASCII (या विस्तारित ASCII) फ़ाइलों को कमांड लाइन या बैच फ़ाइल के माध्यम से संशोधित करने के लिए बहुत सुविधाजनक है। विशुद्ध रूप से मूल स्क्रिप्ट को किसी भी 3 पार्टी के निष्पादन योग्य इंस्टॉलेशन की आवश्यकता नहीं होती है, और यह XP के बाद से किसी भी आधुनिक विंडोज संस्करण पर काम करता है। यह भी बहुत तेज है, खासकर जब शुद्ध बैच समाधानों की तुलना में।

REPL.BAT केवल स्टड पढ़ता है, एक JScript रेगेक्स खोज करता है और प्रतिस्थापित करता है, और परिणाम को स्टडआउट लिखता है।

यहाँ कैसे परीक्षण में बार के साथ फू को बदलने के लिए एक तुच्छ उदाहरण दिया गया है। मान लें कि REPL.BAT आपके मौजूदा फ़ोल्डर में है, या बेहतर अभी तक, आपके पेटीएम में कहीं है:

type test.txt|repl "foo" "bar" >test.txt.new
move /y test.txt.new test.txt

JScript regex क्षमताएं इसे बहुत शक्तिशाली बनाती हैं, विशेष रूप से खोज पाठ से कैप्चर किए गए सब्सट्रिंग को संदर्भित करने के लिए प्रतिस्थापन पाठ की क्षमता।

मैंने उपयोगिता में कई विकल्पों को शामिल किया है जो इसे काफी शक्तिशाली बनाते हैं। उदाहरण के लिए, संयोजन Mऔर Xविकल्प द्विआधारी फ़ाइलों के संशोधन को सक्षम करते हैं! Mमल्टी लाइन विकल्प कई पंक्तियों में खोजों के लिए अनुमति देता है। Xविस्तारित प्रतिस्थापन पैटर्न विकल्प बच दृश्यों कि प्रतिस्थापन टेक्स्ट में कहीं भी बाइनरी मान के शामिल किए जाने को सक्षम प्रदान करता है।

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

यहाँ REPL.BAT स्क्रिप्ट है। पूर्ण प्रलेखन स्क्रिप्ट के भीतर एम्बेडेड है।

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment

::************ Documentation ***********
::REPL.BAT version 6.2
:::
:::REPL  Search  Replace  [Options  [SourceVar]]
:::REPL  /?[REGEX|REPLACE]
:::REPL  /V
:::
:::  Performs a global regular expression search and replace operation on
:::  each line of input from stdin and prints the result to stdout.
:::
:::  Each parameter may be optionally enclosed by double quotes. The double
:::  quotes are not considered part of the argument. The quotes are required
:::  if the parameter contains a batch token delimiter like space, tab, comma,
:::  semicolon. The quotes should also be used if the argument contains a
:::  batch special character like &, |, etc. so that the special character
:::  does not need to be escaped with ^.
:::
:::  If called with a single argument of /?, then prints help documentation
:::  to stdout. If a single argument of /?REGEX, then opens up Microsoft's
:::  JScript regular expression documentation within your browser. If a single
:::  argument of /?REPLACE, then opens up Microsoft's JScript REPLACE
:::  documentation within your browser.
:::
:::  If called with a single argument of /V, case insensitive, then prints
:::  the version of REPL.BAT.
:::
:::  Search  - By default, this is a case sensitive JScript (ECMA) regular
:::            expression expressed as a string.
:::
:::            JScript regex syntax documentation is available at
:::            http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx
:::
:::  Replace - By default, this is the string to be used as a replacement for
:::            each found search expression. Full support is provided for
:::            substituion patterns available to the JScript replace method.
:::
:::            For example, $& represents the portion of the source that matched
:::            the entire search pattern, $1 represents the first captured
:::            submatch, $2 the second captured submatch, etc. A $ literal
:::            can be escaped as $$.
:::
:::            An empty replacement string must be represented as "".
:::
:::            Replace substitution pattern syntax is fully documented at
:::            http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx
:::
:::  Options - An optional string of characters used to alter the behavior
:::            of REPL. The option characters are case insensitive, and may
:::            appear in any order.
:::
:::            A - Only print altered lines. Unaltered lines are discarded.
:::                If the S options is present, then prints the result only if
:::                there was a change anywhere in the string. The A option is
:::                incompatible with the M option unless the S option is present.
:::
:::            B - The Search must match the beginning of a line.
:::                Mostly used with literal searches.
:::
:::            E - The Search must match the end of a line.
:::                Mostly used with literal searches.
:::
:::            I - Makes the search case-insensitive.
:::
:::            J - The Replace argument represents a JScript expression.
:::                The expression may access an array like arguments object
:::                named $. However, $ is not a true array object.
:::
:::                The $.length property contains the total number of arguments
:::                available. The $.length value is equal to n+3, where n is the
:::                number of capturing left parentheses within the Search string.
:::
:::                $[0] is the substring that matched the Search,
:::                $[1] through $[n] are the captured submatch strings,
:::                $[n+1] is the offset where the match occurred, and
:::                $[n+2] is the original source string.
:::
:::                Arguments $[0] through $[10] may be abbreviated as
:::                $1 through $10. Argument $[11] and above must use the square
:::                bracket notation.
:::
:::            L - The Search is treated as a string literal instead of a
:::                regular expression. Also, all $ found in the Replace string
:::                are treated as $ literals.
:::
:::            M - Multi-line mode. The entire contents of stdin is read and
:::                processed in one pass instead of line by line, thus enabling
:::                search for \n. This also enables preservation of the original
:::                line terminators. If the M option is not present, then every
:::                printed line is terminated with carriage return and line feed.
:::                The M option is incompatible with the A option unless the S
:::                option is also present.
:::
:::                Note: If working with binary data containing NULL bytes,
:::                      then the M option must be used.
:::
:::            S - The source is read from an environment variable instead of
:::                from stdin. The name of the source environment variable is
:::                specified in the next argument after the option string. Without
:::                the M option, ^ anchors the beginning of the string, and $ the
:::                end of the string. With the M option, ^ anchors the beginning
:::                of a line, and $ the end of a line.
:::
:::            V - Search and Replace represent the name of environment
:::                variables that contain the respective values. An undefined
:::                variable is treated as an empty string.
:::
:::            X - Enables extended substitution pattern syntax with support
:::                for the following escape sequences within the Replace string:
:::
:::                \\     -  Backslash
:::                \b     -  Backspace
:::                \f     -  Formfeed
:::                \n     -  Newline
:::                \q     -  Quote
:::                \r     -  Carriage Return
:::                \t     -  Horizontal Tab
:::                \v     -  Vertical Tab
:::                \xnn   -  Extended ASCII byte code expressed as 2 hex digits
:::                \unnnn -  Unicode character expressed as 4 hex digits
:::
:::                Also enables the \q escape sequence for the Search string.
:::                The other escape sequences are already standard for a regular
:::                expression Search string.
:::
:::                Also modifies the behavior of \xnn in the Search string to work
:::                properly with extended ASCII byte codes.
:::
:::                Extended escape sequences are supported even when the L option
:::                is used. Both Search and Replace support all of the extended
:::                escape sequences if both the X and L opions are combined.
:::
:::  Return Codes:  0 = At least one change was made
:::                     or the /? or /V option was used
:::
:::                 1 = No change was made
:::
:::                 2 = Invalid call syntax or incompatible options
:::
:::                 3 = JScript runtime error, typically due to invalid regex
:::
::: REPL.BAT was written by Dave Benham, with assistance from DosTips user Aacini
::: to get \xnn to work properly with extended ASCII byte codes. Also assistance
::: from DosTips user penpen diagnosing issues reading NULL bytes, along with a
::: workaround. REPL.BAT was originally posted at:
::: http://www.dostips.com/forum/viewtopic.php?f=3&t=3855
:::

::************ Batch portion ***********
@echo off
if .%2 equ . (
  if "%~1" equ "/?" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^:::" "" a
    exit /b 0
  ) else if /i "%~1" equ "/?regex" (
    explorer "http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx"
    exit /b 0
  ) else if /i "%~1" equ "/?replace" (
    explorer "http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx"
    exit /b 0
  ) else if /i "%~1" equ "/V" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^::(REPL\.BAT version)" "$1" a
    exit /b 0
  ) else (
    call :err "Insufficient arguments"
    exit /b 2
  )
)
echo(%~3|findstr /i "[^SMILEBVXAJ]" >nul && (
  call :err "Invalid option(s)"
  exit /b 2
)
echo(%~3|findstr /i "M"|findstr /i "A"|findstr /vi "S" >nul && (
  call :err "Incompatible options"
  exit /b 2
)
cscript //E:JScript //nologo "%~f0" %*
exit /b %errorlevel%

:err
>&2 echo ERROR: %~1. Use REPL /? to get help.
exit /b

************* JScript portion **********/
var rtn=1;
try {
  var env=WScript.CreateObject("WScript.Shell").Environment("Process");
  var args=WScript.Arguments;
  var search=args.Item(0);
  var replace=args.Item(1);
  var options="g";
  if (args.length>2) options+=args.Item(2).toLowerCase();
  var multi=(options.indexOf("m")>=0);
  var alterations=(options.indexOf("a")>=0);
  if (alterations) options=options.replace(/a/g,"");
  var srcVar=(options.indexOf("s")>=0);
  if (srcVar) options=options.replace(/s/g,"");
  var jexpr=(options.indexOf("j")>=0);
  if (jexpr) options=options.replace(/j/g,"");
  if (options.indexOf("v")>=0) {
    options=options.replace(/v/g,"");
    search=env(search);
    replace=env(replace);
  }
  if (options.indexOf("x")>=0) {
    options=options.replace(/x/g,"");
    if (!jexpr) {
      replace=replace.replace(/\\\\/g,"\\B");
      replace=replace.replace(/\\q/g,"\"");
      replace=replace.replace(/\\x80/g,"\\u20AC");
      replace=replace.replace(/\\x82/g,"\\u201A");
      replace=replace.replace(/\\x83/g,"\\u0192");
      replace=replace.replace(/\\x84/g,"\\u201E");
      replace=replace.replace(/\\x85/g,"\\u2026");
      replace=replace.replace(/\\x86/g,"\\u2020");
      replace=replace.replace(/\\x87/g,"\\u2021");
      replace=replace.replace(/\\x88/g,"\\u02C6");
      replace=replace.replace(/\\x89/g,"\\u2030");
      replace=replace.replace(/\\x8[aA]/g,"\\u0160");
      replace=replace.replace(/\\x8[bB]/g,"\\u2039");
      replace=replace.replace(/\\x8[cC]/g,"\\u0152");
      replace=replace.replace(/\\x8[eE]/g,"\\u017D");
      replace=replace.replace(/\\x91/g,"\\u2018");
      replace=replace.replace(/\\x92/g,"\\u2019");
      replace=replace.replace(/\\x93/g,"\\u201C");
      replace=replace.replace(/\\x94/g,"\\u201D");
      replace=replace.replace(/\\x95/g,"\\u2022");
      replace=replace.replace(/\\x96/g,"\\u2013");
      replace=replace.replace(/\\x97/g,"\\u2014");
      replace=replace.replace(/\\x98/g,"\\u02DC");
      replace=replace.replace(/\\x99/g,"\\u2122");
      replace=replace.replace(/\\x9[aA]/g,"\\u0161");
      replace=replace.replace(/\\x9[bB]/g,"\\u203A");
      replace=replace.replace(/\\x9[cC]/g,"\\u0153");
      replace=replace.replace(/\\x9[dD]/g,"\\u009D");
      replace=replace.replace(/\\x9[eE]/g,"\\u017E");
      replace=replace.replace(/\\x9[fF]/g,"\\u0178");
      replace=replace.replace(/\\b/g,"\b");
      replace=replace.replace(/\\f/g,"\f");
      replace=replace.replace(/\\n/g,"\n");
      replace=replace.replace(/\\r/g,"\r");
      replace=replace.replace(/\\t/g,"\t");
      replace=replace.replace(/\\v/g,"\v");
      replace=replace.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g,
        function($0,$1,$2){
          return String.fromCharCode(parseInt("0x"+$0.substring(2)));
        }
      );
      replace=replace.replace(/\\B/g,"\\");
    }
    search=search.replace(/\\\\/g,"\\B");
    search=search.replace(/\\q/g,"\"");
    search=search.replace(/\\x80/g,"\\u20AC");
    search=search.replace(/\\x82/g,"\\u201A");
    search=search.replace(/\\x83/g,"\\u0192");
    search=search.replace(/\\x84/g,"\\u201E");
    search=search.replace(/\\x85/g,"\\u2026");
    search=search.replace(/\\x86/g,"\\u2020");
    search=search.replace(/\\x87/g,"\\u2021");
    search=search.replace(/\\x88/g,"\\u02C6");
    search=search.replace(/\\x89/g,"\\u2030");
    search=search.replace(/\\x8[aA]/g,"\\u0160");
    search=search.replace(/\\x8[bB]/g,"\\u2039");
    search=search.replace(/\\x8[cC]/g,"\\u0152");
    search=search.replace(/\\x8[eE]/g,"\\u017D");
    search=search.replace(/\\x91/g,"\\u2018");
    search=search.replace(/\\x92/g,"\\u2019");
    search=search.replace(/\\x93/g,"\\u201C");
    search=search.replace(/\\x94/g,"\\u201D");
    search=search.replace(/\\x95/g,"\\u2022");
    search=search.replace(/\\x96/g,"\\u2013");
    search=search.replace(/\\x97/g,"\\u2014");
    search=search.replace(/\\x98/g,"\\u02DC");
    search=search.replace(/\\x99/g,"\\u2122");
    search=search.replace(/\\x9[aA]/g,"\\u0161");
    search=search.replace(/\\x9[bB]/g,"\\u203A");
    search=search.replace(/\\x9[cC]/g,"\\u0153");
    search=search.replace(/\\x9[dD]/g,"\\u009D");
    search=search.replace(/\\x9[eE]/g,"\\u017E");
    search=search.replace(/\\x9[fF]/g,"\\u0178");
    if (options.indexOf("l")>=0) {
      search=search.replace(/\\b/g,"\b");
      search=search.replace(/\\f/g,"\f");
      search=search.replace(/\\n/g,"\n");
      search=search.replace(/\\r/g,"\r");
      search=search.replace(/\\t/g,"\t");
      search=search.replace(/\\v/g,"\v");
      search=search.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g,
        function($0,$1,$2){
          return String.fromCharCode(parseInt("0x"+$0.substring(2)));
        }
      );
      search=search.replace(/\\B/g,"\\");
    } else search=search.replace(/\\B/g,"\\\\");
  }
  if (options.indexOf("l")>=0) {
    options=options.replace(/l/g,"");
    search=search.replace(/([.^$*+?()[{\\|])/g,"\\$1");
    if (!jexpr) replace=replace.replace(/\$/g,"$$$$");
  }
  if (options.indexOf("b")>=0) {
    options=options.replace(/b/g,"");
    search="^"+search
  }
  if (options.indexOf("e")>=0) {
    options=options.replace(/e/g,"");
    search=search+"$"
  }
  var search=new RegExp(search,options);
  var str1, str2;

  if (srcVar) {
    str1=env(args.Item(3));
    str2=str1.replace(search,jexpr?replFunc:replace);
    if (!alterations || str1!=str2) if (multi) {
      WScript.Stdout.Write(str2);
    } else {
      WScript.Stdout.WriteLine(str2);
    }
    if (str1!=str2) rtn=0;
  } else if (multi){
    var buf=1024;
    str1="";
    while (!WScript.StdIn.AtEndOfStream) {
      str1+=WScript.StdIn.Read(buf);
      buf*=2
    }
    str2=str1.replace(search,jexpr?replFunc:replace);
    WScript.Stdout.Write(str2);
    if (str1!=str2) rtn=0;
  } else {
    while (!WScript.StdIn.AtEndOfStream) {
      str1=WScript.StdIn.ReadLine();
      str2=str1.replace(search,jexpr?replFunc:replace);
      if (!alterations || str1!=str2) WScript.Stdout.WriteLine(str2);
      if (str1!=str2) rtn=0;
    }
  }
} catch(e) {
  WScript.Stderr.WriteLine("JScript runtime error: "+e.message);
  rtn=3;
}
WScript.Quit(rtn);

function replFunc($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10) {
  var $=arguments;
  return(eval(replace));
}


महत्वपूर्ण अद्यतन

मैंने REPL.BAT का विकास रोक दिया है, और इसे JREPL.BAT के साथ बदल दिया है। इस नई उपयोगिता में REPL.BAT की समान कार्यक्षमता है, और भी बहुत कुछ:

  • यूनिकोड UTF-16LE देशी CSCRIPT यूनिकोड क्षमताओं के माध्यम से समर्थन करता है, और ADO के माध्यम से किसी भी अन्य वर्ण सेट (UTF-8 सहित)।
  • सीधे एक फाइल से सीधे लिखें / लिखें: पाइप, पुनर्निर्देशन या चाल कमांड की कोई आवश्यकता नहीं है।
  • शामिल उपयोगकर्ता JScript की आपूर्ति की
  • अनुवाद की सुविधा यूनिक्स ट्रे के समान है, केवल यह रेगेक्स खोज और जेस्क्रिप्ट प्रतिस्थापन का भी समर्थन करता है
  • गैर-मिलान पाठ छोड़ें
  • पंक्ति संख्या के साथ उपसर्ग आउटपुट लाइनें
  • और अधिक...

हमेशा की तरह, पूर्ण दस्तावेज़ स्क्रिप्ट के भीतर एम्बेडेड है।

मूल तुच्छ समाधान अब और भी सरल है:

jrepl "foo" "bar" /f test.txt /o -

JREPL.BAT का वर्तमान संस्करण DosTips पर उपलब्ध है । उपयोग के उदाहरणों और विकास के इतिहास को देखने के लिए धागे में बाद की सभी पोस्ट पढ़ें।


उत्तम सामग्री! मुझे इस सादगी के b / c से प्यार है और जिस तरह से आप इसे जो भी स्क्रिप्ट के लिए अनुकूलित कर सकते हैं, इसलिए गंदे बैच की तुलना में JS कोड लिख रहे हैं।
अडाप्टैबी

संपादित करें - केवल मुद्रित लाइनों के लिए एक विकल्प जोड़ा गया है जिसे संशोधित किया गया है। यह भी \qप्रतिनिधित्व करने के लिए समर्थन करने के लिए एक्स विकल्प बढ़ाया ", और खोज शाब्दिक अब एल और एक्स विकल्पों के संयुक्त होने पर सभी विस्तारित बच अनुक्रमों का समर्थन करते हैं।
डेबनहम

@ दांभाम - +1। यह एक चालाक दृष्टिकोण है, यह कई अन्य कार्यों के लिए भी काम आएगा। इसे पोस्ट करने के लिए धन्यवाद।
bw

EDIT - X विकल्प का उपयोग करने पर मैंने \ xnn के व्यवहार को संशोधित किया ताकि कोड ASCII बाइट कोड का प्रतिनिधित्व करे। एक / V संस्करण विकल्प भी जोड़ा गया।
debhamham

9
@ दांभम यह एक रत्न है। आप इसे GitHub पर या Gist के रूप में क्यों नहीं डालते? संस्करण बनाना, अनुवर्ती, रिलीज / वितरण, सुधार और अधिक आसान बना देगा। अगर आपको इसके लिए मदद चाहिए, तो मुझे बताएं।
आतिफ अजीज

36

FNR का उपयोग करें

fnrउपयोगिता का उपयोग करें । इसके कुछ फायदे मिले हैं fart:

  • नियमित अभिव्यक्ति
  • वैकल्पिक जीयूआई। बैच फाइल में डालने के लिए कमांड लाइन टेक्स्ट बनाने के लिए "Generate कमांड लाइन बटन" है।
  • मल्टी-लाइन पैटर्न: जीयूआई आपको मल्टी-लाइन पैटर्न के साथ आसानी से काम करने की अनुमति देता है। FART में आपको मैन्युअल रूप से लाइन ब्रेक से बचना होगा।
  • आपको पाठ फ़ाइल एन्कोडिंग का चयन करने की अनुमति देता है। साथ ही ऑटो डिटेक्ट का ऑप्शन भी है।

यहां FNR डाउनलोड करें: http://findandreplace.io/?z=codeplex

उपयोग उदाहरण: fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"


1
यह अच्छा है। गुई से कमांड लाइन उत्पन्न करने में सक्षम होना एक अच्छी सरल विशेषता है जो मुझे जल्दी से जा रही है।
डेविड हैमोंड

बहुत उपयोगी उपकरण। इससे पहले FART की कोशिश की, लेकिन प्रलेखन पुराना है।
Artur K atdzior

कूल टूल, यह नियमित अभिव्यक्ति का भी समर्थन करता है। यह कुछ ऐसा है जो FART गायब है।
डियो फुंग

1
इस उपकरण को इंगित करने के लिए धन्यवाद। एकल exe, FART के लिए महान प्रतिस्थापन जो अब विकसित नहीं है (और regex को याद करता है); और PowerShell वाक्यविन्यास sooo असहनीय है।
ग्रास डबल

यह सबसे उपयोगी है। खिड़कियों में grep + sed प्रतिस्थापन की तलाश में था, इसने बहुत अच्छा काम किया!
सर्बान तानसा

25

मुझे नहीं लगता कि किसी भी अंतर्निहित कमांड के साथ ऐसा करने का कोई तरीका है। मैं आपको Gnuwin32 या UnxUtils जैसा कुछ डाउनलोड करने और sedकमांड (या केवल डाउनलोड sed) का उपयोग करने का सुझाव दूंगा :

sed -c s/FOO/BAR/g filename

2
Cygwin ( cygwin.com ) का उपयोग करें । यह वास्तव में लिनक्स स्थापित करने के लिए अगली सबसे अच्छी बात है।
एंड्रयू जॉनसन

यह बेहतर है अगर कोई एक समाधान प्रदान कर सकता है जो कि साइबरविन स्थापित करने पर भरोसा नहीं करता है। POSIX स्ट्रिंग हेरफेर एक ब्रेनर है - विंडोज पर ऐसा करना थोड़ा अधिक अस्पष्ट है।
Rex

4
Gnuwin32 और UnxUtils विंडोज के लिए निर्मित स्टैंड-अलोन बायनेरिज़ हैं। वे साइबरविन पर निर्भर नहीं हैं।
फेरुचियो

1
cygwin: sed -i -b -e 's/FOO/BAR/g' `find . -name *.txt`-i - edit inplace; -b - सीआर + एलएफ की प्रक्रिया न करें - इस विकल्प के बिना सीआर + एलएफ को एलएफ में बदल दिया जाएगा
एलेक्सी विसेन्टसेव

@AndrewJohnson राय और जानकारी दो अलग-अलग चीजें हैं।
पूर्वान्ह

21

मुझे पता है कि मैं पार्टी में देर से आता हूं।

व्यक्तिगत रूप से, मुझे इसका समाधान पसंद है: - http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

हम एसएमडीपी के माध्यम से लगभग 500 ई-मेल को दैनिक रूप से वितरित करने में मदद करने के लिए बड़े पैमाने पर डेडूप फंक्शन का उपयोग करते हैं: - https://groups.google.com/forum/# .topic/alt.msdos.batch.nt/sj8UUMMqq6o

और ये दोनों मूल रूप से बिना किसी अतिरिक्त उपकरण या उपयोगिताओं के काम करते हैं।

Replacer:

DEL New.txt
setLocal EnableDelayedExpansion
For /f "tokens=* delims= " %%a in (OLD.txt) do (
Set str=%%a
set str=!str:FOO=BAR!
echo !str!>>New.txt
)
ENDLOCAL

DEDUPLICATOR (ABA नंबर के लिए -9 के उपयोग पर ध्यान दें):

REM DE-DUPLICATE THE Mapping.txt FILE
REM THE DE-DUPLICATED FILE IS STORED AS new.txt

set MapFile=Mapping.txt
set ReplaceFile=New.txt

del %ReplaceFile%
::DelDupeText.bat
rem https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o
setLocal EnableDelayedExpansion
for /f "tokens=1,2 delims=," %%a in (%MapFile%) do (
set str=%%a
rem Ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.RightString
set str=!str:~-9!
set str2=%%a
set str3=%%a,%%b

find /i ^"!str!^" %MapFile%
find /i ^"!str!^" %ReplaceFile%
if errorlevel 1 echo !str3!>>%ReplaceFile%
)
ENDLOCAL

धन्यवाद!


बैच स्क्रिप्ट केवल फ़ाइल-कॉपी के अलावा कुछ नहीं करता है - यह भी: आप अपने आप को धन्यवाद क्यों दे रहे हैं?
specializt

मूल अनुरोध बैच फ़ाइल का उपयोग करके एक पाठ फ़ाइल में "BAR" के साथ "FOO" को बदलने और अधिमानतः निर्मित कार्यों के साथ था। अगर मुझे Google समूह की पोस्ट पर कुछ भी मिल रहा था, जो मुझे मिला, जो शानदार है और हम आज भी इसका इस्तेमाल करते हैं। इसके अलावा, पोस्ट और प्रतिक्रियाओं को भी देखें, जो उपयोगकर्ताओं के लिए उपयोगी होने के साथ-साथ सड़क पर भी आते हैं। मैं फाइल कॉपी के बारे में आपकी टिप्पणी को देखने में विफल रहा हूं .. निश्चित रूप से, यह एक फ़ाइल की सामग्री लेता है और एक अन्य फ़ाइल में इको का परिणाम देता है, लेकिन डेटा के आधार पर, यह आवश्यक जानकारी को ट्रिम और पार्स करता है। मैं इसे पहले एक कोशिश देने की सलाह दूंगा। ;)
लेप्टान्टर

इसकी मूल रूप से एक फाइल-कॉपी टूल है जो दो स्टैटिक स्ट्रिंग्स को बदल देता है - आप कम से कम दो वैरिएबल वहां रख सकते हैं, इसलिए जो लोग इसे आज़माना चाहते हैं उन्हें सिंटैक्स को समझने की आवश्यकता है ताकि वास्तव में इसका उपयोग करने में सक्षम हो - इंटरनेट पर धारणाएं लगभग पूरी तरह से गलत हैं। उसे याद रखो।
specializt

4
@specializt - कृपया ... मैं यहाँ शब्दार्थ पर बहस करने के लिए नहीं हूँ। यदि आप चाहें, तो क्या हम इस ऑफ़लाइन को चैट रूम में ले जा सकते हैं।
लेप्टान्टर

2
मेरी राय में, यह मूल प्रश्न का उत्तर है। मैं सेटअप के दौरान किसी सेवा के लिए आरंभिक फ़ाइलों को कॉन्फ़िगर करने के लिए इस टिप का उपयोग करूंगा, और मैं PowerShell को सक्षम नहीं करना चाहूंगा, या स्क्रिप्टिंग इंजन को अपने सर्वर पर चलाने की अनुमति नहीं दूंगा। तो अक्सर खिड़कियों से संबंधित सवालों के जवाब, "वहाँ से इस काम को स्थापित करें" के साथ शुरू करें क्योंकि अभी भी "पीसी" रवैया है।
माइक्रो

15

जब आप Windows पर Git के साथ काम करते हैं तो बस फायर git-bash करें और उपयोग करें sed। या, विंडोज 10 का उपयोग करते समय, "लिनक्स पर उबंटू ऑन विंडोज" (लिनक्स सबसिस्टम से) शुरू करें और उपयोग करें sed

इसका एक स्ट्रीम एडिटर, लेकिन निम्न कमांड का उपयोग करके सीधे फाइलों को संपादित कर सकता है:

sed -i -e 's/foo/bar/g' filename
  • -i विकल्प का उपयोग फ़ाइल नाम पर जगह को संपादित करने के लिए किया जाता है।
  • -e विकल्प चलाने के लिए एक कमांड इंगित करता है।
    • s"बार" के साथ पाए जाने वाले अभिव्यक्ति "फू" gको बदलने के लिए उपयोग किया जाता है और किसी भी पाए गए मैचों को बदलने के लिए उपयोग किया जाता है।

EreOn द्वारा नोट:

यदि आप केवल Git रिपॉजिटरी की संस्करणित फ़ाइलों में एक स्ट्रिंग बदलना चाहते हैं, तो आप उपयोग करना चाह सकते हैं:

git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'

जो अद्भुत काम करता है।


1
ध्यान दें कि यदि आप वास्तव में एक गिट रिपॉजिटरी में नाम बदल रहे हैं और केवल संस्करणित फ़ाइलों में बदलना चाहते हैं, तो आप ऐसा करना चाह सकते हैं: git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'जो अद्भुत काम करता है।
Onरॉन

13

मैंने यहां कुछ मौजूदा उत्तरों के साथ खेला और अपने बेहतर समाधान को प्राथमिकता दी ...

type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }"

या यदि आप आउटपुट को फिर से फ़ाइल में सहेजना चाहते हैं ...

type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }" > outputFile.txt

इसका लाभ यह है कि आप किसी भी प्रोग्राम से आउटपुट में पाइप कर सकते हैं। इसके साथ नियमित रूप से अभिव्यक्ति का उपयोग करने पर ध्यान देंगे। हालांकि यह आसान उपयोग के लिए एक बैट फ़ाइल में बनाने के लिए कैसे काम नहीं कर सकता ... :(


3
यह एक अच्छा उपाय है। दुर्भाग्य से, type80 से अधिक वर्णों की सभी पंक्तियों का उपयोग करने का मतलब लिपटा हुआ है। क्या मुसीबत है।
सिरदक

12

मैंने पर्ल का उपयोग किया है, और यह अद्भुत रूप से काम करता है।

perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" <fileName>

.orig वह मूल फ़ाइल है जो वह एक्सटेंशन होगा

कई फाइलों के लिए जैसे * .html

for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x

यह सबसे सरल समाधान है +1, जब sh से बल्लेबाजी में परिवर्तित किया जाता है, तो इसके sedसाथ बदलें perl -pi.backup -eऔर इसकी सराहना करें :)
Yann39

11

Replacer.bat के साथ

1) e?विकल्प के साथ जो विशेष चरित्र अनुक्रमों का मूल्यांकन करेगा जैसे \n\rऔर यूनिकोड अनुक्रम। इस मामले में उद्धृत "Foo"और प्रतिस्थापित किया जाएगा "Bar":

call replacer.bat "e?C:\content.txt" "\u0022Foo\u0022" "\u0022Bar\u0022"

2) सीधे जगह जहां Fooऔर Barउद्धृत नहीं हैं।

call replacer.bat "C:\content.txt" "Foo" "Bar"

यह मेरे लिए काम नहीं कर रहा है। आप इसे कैसे चलाते हैं? मुझे त्रुटि मिल रही है 'replace_in_config.bat' को आंतरिक या बाहरी कमांड, ऑपरेशनल प्रोग्राम या बैच फ़ाइल के रूप में मान्यता नहीं दी जाती है।
FrenkyB

@FrenkyB - इसे उसी निर्देशिका में होना चाहिए जहाँ आप इसे या पथ पर भेज रहे हैं
ss64.com/nt/path.html

मेरे पास एक ही डायरेक्टरी में तीनों फाइलें हैं।
FrenkyB

9

यहाँ एक समाधान है जो मुझे मिला है वह विन एक्सपी पर काम करता है। मेरे रनिंग बैच फ़ाइल में, मैंने निम्नलिखित शामिल किया:

set value=new_value

:: Setup initial configuration
:: I use && as the delimiter in the file because it should not exist, thereby giving me the whole line
::
echo --> Setting configuration and properties.
for /f "tokens=* delims=&&" %%a in (config\config.txt) do ( 
  call replace.bat "%%a" _KEY_ %value% config\temp.txt 
)
del config\config.txt
rename config\temp.txt config.txt

replace.batफ़ाइल नीचे के रूप में है। मुझे एक ही बैच फ़ाइल के भीतर उस फ़ंक्शन को शामिल करने का कोई तरीका नहीं मिला, क्योंकि %%aचर हमेशा लूप के लिए अंतिम मान देता है।

replace.bat:

@echo off

:: This ensures the parameters are resolved prior to the internal variable
::
SetLocal EnableDelayedExpansion

:: Replaces Key Variables
::
:: Parameters:
:: %1  = Line to search for replacement
:: %2  = Key to replace
:: %3  = Value to replace key with
:: %4  = File in which to write the replacement
::

:: Read in line without the surrounding double quotes (use ~)
::
set line=%~1

:: Write line to specified file, replacing key (%2) with value (%3)
::
echo !line:%2=%3! >> %4

:: Restore delayed expansion
::
EndLocal

1
अफसोस की बात यह है कि यह खाली लाइनों को भी छोड़ देता है। {{For}} कमांड का एक फीचर
जॉन रोचा

7

इस पर एक नज़र डालें कि क्या cmd.exe के लिए उपयोगिता जैसी कोई सीड है जो विंडोज के तहत एक सीड समकक्ष के लिए पूछी गई है, इस प्रश्न पर भी लागू होनी चाहिए। कार्यकारी सारांश:

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

4

थोड़ी देर हो सकती है, लेकिन मैं अक्सर इसी तरह के सामान की तलाश कर रहा हूं, क्योंकि मैं सॉफ्टवेयर अनुमोदित होने के दर्द से नहीं गुजरना चाहता हूं।

हालाँकि, आप आमतौर पर विभिन्न रूपों में कथन का उपयोग करते हैं। किसी ने एक उपयोगी बैच फ़ाइल बनाई जो खोज और प्रतिस्थापित करती है। यहाँ एक नज़र है । प्रदान की गई बैच फ़ाइल की सीमाओं को समझना महत्वपूर्ण है। इस कारण मैं इस उत्तर में स्रोत कोड की नकल नहीं करता।


4

दो बैच फाइलें जो आपूर्ति search and replaceकार्यों को स्टैक ओवरफ्लो सदस्यों द्वारा लिखी गई हैं dbenhamऔर विंडोज में aaciniउपयोग कर native built-in jscriptरही हैं।

वे दोनों कर रहे हैं robustऔर very swift with large filesसादा बैच पटकथा की तुलना में, और भी simplerमूल पाठ की जगह के लिए उपयोग करने के लिए। इन दोनों में Windows regular expressionपैटर्न मैचिंग है।

  1. इस sed-likeसहायक बैच फ़ाइल को repl.bat(dbenham द्वारा) कहा जाता है ।

    Lशाब्दिक स्विच का उपयोग करके उदाहरण :

    echo This is FOO here|repl "FOO" "BAR" L
    echo and with a file:
    type "file.txt" |repl "FOO" "BAR" L >"newfile.txt"
    
  2. इस grep-likeसहायक बैच फ़ाइल को findrepl.bat(एनाकिनी द्वारा) कहा जाता है ।

    उदाहरण जिसमें नियमित अभिव्यक्ति सक्रिय है:

    echo This is FOO here|findrepl "FOO" "BAR" 
    echo and with a file:
    type "file.txt" |findrepl "FOO" "BAR" >"newfile.txt"
    

दोनों शक्तिशाली सिस्टम-वाइड उपयोगिताओं बन जाते हैं when placed in a folder that is on the path, या एक बैच फ़ाइल के साथ, या cmd प्रॉम्प्ट से एक ही फ़ोल्डर में उपयोग किया जा सकता है।

उनके पास case-insensitiveस्विच और कई अन्य कार्य भी हैं।


3

पावर शेल कमांड एक आकर्षण की तरह काम करता है

(
test.txt | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
)

3

बस एक समान समस्या का सामना करना पड़ा - "फाइलों के भीतर पाठ को खोजें और बदलें", लेकिन इस अपवाद के साथ कि फ़ाइल नाम और खोज / प्रत्यावर्तन दोनों के लिए मुझे regex का उपयोग करने की आवश्यकता है। क्योंकि मैं पॉवर्सशेल से परिचित नहीं हूं और बाद में अपनी उपयोग के लिए अपनी खोजों को सहेजना चाहता हूं, मुझे कुछ और "उपयोगकर्ता के अनुकूल" चाहिए (बेहतर अगर यह जीयूआई है)।

इसलिए, जबकि Googling :) मुझे एक महान उपकरण मिला - FAR (ढूँढें और बदलें) (FART नहीं)।

उस छोटे से कार्यक्रम में फ़ाइल नाम और फ़ाइलों के भीतर खोज के लिए अच्छा GUI और समर्थन regex है। केवल अस्वीकृति यह है कि यदि आप अपनी सेटिंग्स को सहेजना चाहते हैं, तो आपको प्रोग्राम को एक व्यवस्थापक के रूप में चलाना होगा (कम से कम Win7 पर)।


इसका उत्तर २०१० @VonC की ओर से इसी सूत्र में दिया गया है
जेब

@jeb मैं बताया कि एफएआर नहीं है गोज़ - लगभग समान नाम के साथ दो अलग अलग कार्यक्रमों। सुदूर जीयूआई है और, regex के साथ काम कर सकते हैं, जबकि कि नीचे टिप्पणी में धागा लोगों का उल्लेख है कि गोज़ नहीं है समर्थन regex।
madcorp

3

मैं Win32 के लिए GNU उपयोगिताओंsed से उपयोग करना पसंद कर रहा हूं , इस पर ध्यान देने की आवश्यकता है

  • एकल उद्धरण ''खिड़कियों में काम नहीं करेगा, ""इसके बजाय उपयोग करें
  • sed -iखिड़कियों में काम नहीं करेगा, इसे फ़ाइल स्वैपिंग की आवश्यकता होगी

इसलिए sedविंडोज़ में एक फाइल में टेक्स्ट को खोजने और बदलने का कार्य कोड नीचे दिया गया है

sed -e "s/foo/bar/g" test.txt > tmp.txt && mv tmp.txt test.txt

2
विंडोज उपयोगकर्ताओं को तुरंत फ़ाइल स्वैपिंग करने से पहले: इन-प्लेस एडिटिंग के नए संस्करणों के साथ इन-प्लेस एडिटिंग -i! यदि आपका sed संस्करण है, तो इस उत्तर से कमांड की जांच करें: stackoverflow.com/a/33762001/2492801
बेंजामिन बिहलर

2

यह एक ऐसी चीज है जो बैच स्क्रिप्टिंग सिर्फ अच्छा नहीं करती है।

लिपि मोरचिल्ली से जुड़ी कुछ फाइलों के लिए काम करेगी, लेकिन दुर्भाग्य से यह उन पर चोक होगी जिसमें पाइप और एम्पायरैंड्स जैसे अक्षर हैं।

VBScript इस कार्य के लिए एक बेहतर अंतर्निहित उपकरण है। इस लेख को एक उदाहरण के लिए देखें: http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx


2

@ राचेल ने एक उत्कृष्ट उत्तर दिया, लेकिन यहां एक विविधता वाले $dataचर में सामग्री को पढ़ने के लिए इसका एक रूपांतर है । फिर आप आउटपुट फ़ाइल में लिखने से पहले सामग्री को कई बार आसानी से जोड़ सकते हैं। यह भी देखें कि एक .bat बैच फ़ाइलों में बहु-पंक्ति मान कैसे दिए जाते हैं।

@REM ASCII=7bit ascii(no bom), UTF8=with bom marker
set cmd=^
  $old = '\$Param1\$'; ^
  $new = 'Value1'; ^
  [string[]]$data = Get-Content 'datafile.txt'; ^
  $data = $data -replace $old, $new; ^
  out-file -InputObject $data -encoding UTF8 -filepath 'datafile.txt';
powershell -NoLogo -Noninteractive -InputFormat none -Command "%cmd%"

2

विंडोज 7+ के लिए .bat - में पॉवरशेल का उपयोग करें

utf8 एन्कोडिंग वैकल्पिक है, वेब साइटों के लिए अच्छा है

@echo off
set ffile='myfile.txt'
set fold='FOO'
set fnew='BAR'
powershell -Command "(gc %ffile%) -replace %fold%, %fnew% | Out-File %ffile% -encoding utf8"

1

विंडोज कमांड लाइन पर साइगविन (फ्री) डाउनलोड करें और यूनिक्स की तरह कमांड का उपयोग करें।

आपकी सबसे अच्छी शर्त: sed


10
साइग्विन बुराई है। इसे स्थापित न करें। नीचे वर्णित यूनिक्स यूटिल्स का बेहतर उपयोग करें।
जेडू

24
इसके बारे में इतनी बुराई क्या है?
जेएम।

@ जेएम हो सकता है क्योंकि जब भी आप चाहते हैं तो आपको एक ही निष्पादन योग्य का उपयोग करने के बजाय पूरी चीज़ को एक साथ स्थापित करना होगा।
एंड्री

बेहतर पॉवरशेल का उपयोग करें, यह वास्तव में अंतर्निहित विंडोज़ है।
पूर्वान्ह

0

Https://zoomicon.github.io/tranXform/ पर रिप्लेस और रिप्लेसमेंट टूल भी देख सकते हैं (स्रोत शामिल) । दूसरा एक फिल्टर है।

फ़ाइलों में स्ट्रिंग को बदलने वाला उपकरण VBScript में है (पुराने Windows संस्करणों में चलाने के लिए Windows स्क्रिप्ट होस्ट [WSH] की आवश्यकता है)

फ़िल्टर शायद यूनिकोड के साथ काम नहीं कर रहा है जब तक कि आप नवीनतम डेल्फी (या फ़्री पास्कल / लाजर के साथ पुनर्मिलन न करें)


-5

विजुअल C ++ के तहत कोडिंग करते समय मुझे कई बार इस समस्या का सामना करना पड़ा है। यदि आपके पास यह है, तो आप विजुअल स्टूडियो फाइंड एंड यूटिलिटी का उपयोग कर सकते हैं। यह आपको एक फ़ोल्डर का चयन करने और उस फ़ोल्डर में किसी भी फ़ाइल की सामग्री को किसी अन्य पाठ के साथ बदलने की अनुमति देता है जिसे आप चाहते हैं।

दृश्य स्टूडियो के अंतर्गत: संपादित करें - खोजें और बदलें खुले हुए संवाद में, अपने फ़ोल्डर का चयन करें और "खोजें क्या" और "बदलें के साथ" बॉक्स भरें। आशा है कि यह मददगार होगा।


2
नजीब, आपका जवाब उपयोगकर्ता की मदद नहीं करता है क्योंकि आपका मानना ​​है कि वे सॉफ्टवेयर का उपयोग कर रहे हैं जिसका वे कोई उल्लेख नहीं करते हैं। कृपया एक विकल्प सुझाएं जिसमें सॉफ्टवेयर की आवश्यकता न हो।
ऐब्रीयन

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