Bagaimana Anda bisa menemukan dan mengganti teks dalam file menggunakan lingkungan baris perintah Windows?

492

Saya menulis skrip file batch menggunakan lingkungan baris perintah Windows dan ingin mengubah setiap kemunculan beberapa teks dalam file (mis. "FOO") dengan yang lain (mis. "BAR"). Apa cara paling sederhana untuk melakukan itu? Adakah fungsi bawaan?

sinar
sumber

Jawaban:

308

Banyak jawaban di sini membantu mengarahkan saya ke arah yang benar, namun tidak ada yang cocok untuk saya, jadi saya memposting solusi saya.

Saya memiliki Windows 7, yang dilengkapi dengan PowerShell bawaan. Berikut ini skrip yang saya gunakan untuk menemukan / mengganti semua instance teks dalam file:

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

Untuk menjelaskannya:

  • powershell memulai powershell.exe, yang termasuk dalam Windows 7
  • -Command "... " adalah baris perintah arg untuk powershell.exe yang berisi perintah untuk dijalankan
  • (gc myFile.txt)membaca isi myFile.txt( gckependekan dari Get-Contentperintah)
  • -replace 'foo', 'bar'hanya menjalankan mengganti perintah untuk mengganti foodenganbar
  • | Out-File myFile.txt menyalurkan output ke file myFile.txt
  • -encoding ASCII mencegah menyalin file output ke unicode, seperti komentar menunjukkan

Powershell.exe seharusnya sudah menjadi bagian dari pernyataan PATH Anda, tetapi jika tidak, Anda dapat menambahkannya. Lokasi itu di komputer sayaC:\WINDOWS\system32\WindowsPowerShell\v1.0

Rachel
sumber
71
Hati-hati, perintah ini juga dapat mentranskode file ke penyandian Unicode. Anda dapat secara manual menentukan pengkodean dengan menambahkan -encoding ASCIIatau UTF8atau apa pun yang diperlukan. Berhati-hatilah, jika Anda menargetkan UTF8, ia mungkin memperkenalkan Tanda Pesanan Byte di awal file yang tidak muncul dalam aslinya.
Wyck
78
@ Wyck Butuh beberapa saat untuk mencari tahu di mana harus meletakkan -encoding ASCII. Bagi siapa pun yang membutuhkannya di masa depan, itu akan menjadiOut-File -encoding ASCII myFile.txt
rwilson04
15
Satu-satunya hal yang harus saya ubah adalah menggunakan Set-Contentalih-alih Out-File.
kurtzmarc
6
Ini berfungsi, tetapi kinerjanya buruk bahkan pada daftar file pendek.
jsuddsjr
23
Waspadalah bahwa token ganti ('foo' dalam kasus ini) diperlakukan sebagai ekspresi reguler. Jika Anda memiliki karakter khusus di sana (saya punya []), Anda harus menambahkannya dengan \ (backslash).
JW
183

Jika Anda menggunakan versi Windows yang mendukung .Net 2.0, saya akan mengganti shell Anda. PowerShell memberi Anda kekuatan penuh .Net dari baris perintah. Ada banyak commandlets yang dibangun juga. Contoh di bawah ini akan menyelesaikan pertanyaan Anda. Saya menggunakan nama lengkap dari perintah, ada alias lebih pendek, tetapi ini memberi Anda sesuatu untuk Google.

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
Mike Schall
sumber
10
Saya dapat melihat PowerShell mampu mengarsipkan ini. Tetapi bagaimana saya bisa menjalankan ini dari file batch (contoh: myProc.bat)?
Pablo Venturino
3
@Pablo, gunakan powershell.exe dan bungkus perintah ps ke dalam parameter tunggal
lubos hasko
56
-1 .. Tentu jawabannya diterima, tetapi itu bukan jawaban untuk pertanyaan yang ditentukan.
baash05
28
Ini akan gagal dengan file yang digunakan kesalahan jika Anda menyimpan ke file yang sama. Anda perlu mengubah perintah powershell ke: (Get-Content test.txt) | ForEach-Object {$ _ -replace "foo", "bar"} | Set-Content test.txt
BigMomma
6
Lihat jawaban dari @Rachel:powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
Nigel Touch
161

Baru saja menggunakan FART (" F ind A nd R eplace T ext" utilitas baris perintah):
freeware kecil yang luar biasa untuk penggantian teks dalam satu set besar file.

File pengaturan ada di SourceForge .

Contoh penggunaan:

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

akan melihat pratinjau penggantian yang dilakukan secara rekursif dalam file distribusi Perl ini.

Satu-satunya masalah: ikon situs web FART tidak sepenuhnya berselera, halus atau elegan;)


Perbarui 2017 (7 tahun kemudian) jagb menunjukkan dalam komentarnya pada artikel 2011 " MENGHADAPI Cara Mudah - Temukan Dan Ganti Teks " dari Mikail Tunç

VONC
sumber
19
Yang keren adalah itu adalah satu exe tunggal. Tidak ada ketergantungan. Tidak ada cetakan kecil. Sangat mudah digunakan.
Serge Wautier
2
Sangat ringan dan mudah digunakan, tetapi saya berharap itu akan mencetak tempat yang tepat tempat penggantian terjadi. Tidak bisa melihat itu memberi saya rasa tidak aman.
William Niu
4
Terima kasih, ini sempurna, harus menjadi bagian dari alat dos standar dan bekerja pesona. Namun opsi -p tidak menunjukkan berapa banyak perubahan yang 'akan' ia buat dan selalu melaporkan 0 yang membuat saya beberapa menit
sradforth
3
Saya mengerti ini adalah pertanyaan yang sangat lama tetapi saya menemukan lebih banyak informasi dan berharap ini akan bermanfaat bagi pengguna Stack Overflow. Hanya tautan lain untuk FART di mana produk dijelaskan dengan baik: FART dijelaskan @ emtunc.org dan halaman lain dapat ditemukan di sini: FART Harap berhati-hati dengan penggantian /dan 'karena ini tidak bekerja untuk kita semua , bagi saya itu bekerja di beberapa kasing tetapi tidak berfungsi pada beberapa file dan saya tidak tahu mengapa .. Saya menggunakan ini untuk mengganti teks dengan teks lain dan/
jagb
4
@ jagb Terima kasih. Saya telah memasukkan tautan Anda dalam jawaban untuk visibilitas lebih lanjut.
VonC
128

Ganti - Ganti substring menggunakan substitusi string Keterangan: Untuk mengganti substring dengan string lain gunakan fitur substitusi string. Contoh yang ditampilkan di sini menggantikan semua kemunculan "teh" salah eja dengan "the" dalam string variabel str.

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

Output Skrip:

teh cat in teh hat
the cat in the hat

ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

Bill Richardson
sumber
30
Bagaimana saran sed yang lebih baik? Ini tampaknya menjadi jawaban paling sederhana dari semuanya dan tidak perlu menginstal apa pun.
DonBecker
5
Bisakah pencocokan pola apa pun dilakukan di sini? Wildcard, Regex dll?
Keyo
27
"Bagaimana saran sed yang lebih baik?" - sed dan utilitas serupa beroperasi pada file; cuplikan ini menghilangkan langkah penting dari membaca baris dari file input dan menulis ke file output, sambil memastikan bahwa setiap karakter khusus dalam file ditangani dengan benar.
Joe
7
@ Asad, ya itu benar, OP bertanya tentang file, tetapi sebenarnya ini berfungsi dengan stream yang tidak harus berupa file. Tetapi poin saya di sini adalah bahwa jawaban ini cacat, karena menghilangkan membaca / menulis dari aliran dan menangani karakter khusus apa pun.
Joe
4
@Bill cara menggunakan variabel sebagai teks pengganti? yaitu. Saya memiliki nilai dalam sebuah variabel dan string yang memiliki beberapa pembatas. set str =% str: "##" =% varValue %% tidak berfungsi. Ada solusi?
MalTec
55

Buat file replace.vbs:

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

Untuk menggunakan skrip yang direvisi ini (yang akan kami sebut replace.vbs) cukup ketik perintah yang mirip dengan ini dari command prompt:

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

pengguna459118
sumber
ini rapi, apakah itu memungkinkan penggunaan RegEx?
user280109
3
@ user280109 Ya, VBScript mendukung RegExp. Anda dapat menggunakan ini untuk mengganti menggunakan ekspresi reguler: With (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With. Anda bisa mendapatkan teks dari 9 kelompok menangkap pertama yang menggunakan $1, $2... $9.
Sikat gigi
2
VBScript sering diabaikan (dan dibenci), tetapi tersedia di semua platform Windows, sangat mudah dibaca dan sebenarnya memiliki kemampuan yang sangat kuat +1
zelanix
1
@ user280109 Anda baru saja memberi perintah, Apa yang saya butuhkan. Tetapi saya ingin mengganti (case-insensitive) Dapatkah Anda memberikan perintah untuk itu?
Ajmal Praveen
49

BatchSubstitute.batdi dostips.com adalah contoh pencarian dan penggantian menggunakan file batch murni.

Ini menggunakan kombinasi dari FOR, FINDdan CALL SET.

Baris yang mengandung karakter di antara "&<>]|^dapat diperlakukan secara tidak benar.


morechilli
sumber
8
Saya harus mempertanyakan kegunaan situs cuplikan kode yang ketentuan penggunaannya melarang menyalin kode mana pun ("Anda tidak boleh mendistribusikan informasi apa pun yang diberikan di bawah domain dostips.com dalam bentuk apa pun tanpa izin tertulis dari pemilik domain.") .
Gilles 'SO- stop being evil'
1
Saya setuju syarat mereka membingungkan, mereka juga mengatakan "Informasi yang disediakan di bawah domain dostips.com semoga bermanfaat" jadi asumsi saya adalah mereka senang orang menyalin kode untuk menyelesaikan masalah. Saya tidak yakin pernah membaca syarat dan ketentuan dan senang ...
morechilli
5
Ini bagus. Saya suka jawaban yang tidak melibatkan pengunduhan hal lain untuk melakukannya.
Ruairi O'Brien
Saya juga menyukai solusi yang tidak melibatkan utilitas eksternal, sayangnya, saya terus mendapatkan "find: predicate` `" ketika saya mencoba menjalankan batch ini. Tidak benar-benar punya waktu untuk men-debug itu sekarang.
Jahmic
2
Kesalahan "find: predicate` `" disebabkan oleh utilitas eksternal 'find' di sistem saya. Setelah dihapus, ini berfungsi dengan baik.
Jahmic
47

Catatan - Pastikan untuk melihat pembaruan di akhir jawaban ini untuk tautan ke JREPL.BAT superior yang menggantikan REPL.BAT
JREPL.BAT 7.0 dan di atas secara asli mendukung unicode (UTF-16LE) melalui /UTFopsi, serta semua set karakter lainnya, termasuk UTF-8, via ADO !!!!


Saya telah menulis sebuah utilitas JScript / batch hybrid kecil yang disebut REPL.BAT yang sangat nyaman untuk memodifikasi file ASCII (atau extended ASCII) melalui baris perintah atau file batch. Skrip asli asli tidak memerlukan instalasi dari pihak ke-3 yang dapat dieksekusi, dan skrip ini berfungsi pada semua versi Windows modern mulai dari XP dan seterusnya. Ini juga sangat cepat, terutama jika dibandingkan dengan solusi batch murni.

REPL.BAT cukup membaca stdin, melakukan pencarian dan penggantian regex JScript, dan menulis hasilnya ke stdout.

Berikut ini adalah contoh sepele tentang cara mengganti foo dengan bar di test.txt, dengan asumsi REPL.BAT ada di folder Anda saat ini, atau lebih baik lagi, di suatu tempat dalam PATH Anda:

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

Kemampuan JScript regex membuatnya sangat kuat, terutama kemampuan teks pengganti untuk referensi substring yang diambil dari teks pencarian.

Saya telah menyertakan sejumlah opsi dalam utilitas yang membuatnya cukup kuat. Misalnya, menggabungkan opsi Mdan Xmemungkinkan modifikasi file biner! Opsi MMulti-line memungkinkan pencarian di beberapa baris. The Xpilihan pola substitusi eXtended menyediakan escape sequence yang memungkinkan masuknya setiap nilai biner dalam teks pengganti.

Utilitas keseluruhan dapat ditulis sebagai JScript murni, tetapi file kumpulan hybrid menghilangkan kebutuhan untuk secara eksplisit menentukan CSCRIPT setiap kali Anda ingin menggunakan utilitas.

Berikut ini skrip REPL.BAT. Dokumentasi lengkap tertanam dalam skrip.

@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));
}


PEMBARUAN PENTING

Saya telah menghentikan pengembangan REPL.BAT, dan menggantinya dengan JREPL.BAT. Utilitas yang lebih baru ini memiliki semua fungsi REPL.BAT yang sama, ditambah lebih banyak lagi:

  • Dukungan Unicode UTF-16LE melalui kemampuan unicode CSCRIPT asli, dan set karakter lainnya (termasuk UTF-8) melalui ADO.
  • Baca langsung dari / tulis langsung ke file: tidak perlu untuk pipa, pengalihan, atau memindahkan perintah.
  • Memasukkan JScript yang disediakan pengguna
  • Fasilitas terjemahan mirip dengan unix tr, hanya saja itu juga mendukung pencarian regex dan penggantian JScript
  • Buang teks yang tidak cocok
  • Awali jalur output dengan nomor baris
  • dan banyak lagi ...

Seperti biasa, dokumentasi lengkap tertanam dalam skrip.

Solusi sepele yang asli sekarang bahkan lebih sederhana:

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

Versi JREPL.BAT saat ini tersedia di DosTips . Baca semua posting berikutnya di utas untuk melihat contoh penggunaan dan riwayat pengembangan.

dbenham
sumber
Barang bagus! Saya suka ini b / c dari kesederhanaan dan cara Anda dapat menyesuaikannya dengan skrip apa pun, maka menulis kode JS daripada batch jelek.
Adaptabi
Edit - Menambahkan opsi A hanya untuk mencetak garis yang telah dimodifikasi. Juga meningkatkan opsi X untuk mendukung \quntuk mewakili ", dan Cari literal sekarang mendukung semua urutan pelarian yang diperpanjang ketika opsi L dan X digabungkan.
dbenham
@dbenham - +1. Ini adalah pendekatan yang apik, ini akan berguna untuk beberapa tugas lainnya juga. Terima kasih telah mempostingnya.
bw
EDIT - Saya memodifikasi perilaku \ xnn ketika opsi X digunakan sehingga kode tersebut mewakili kode byte ASCII yang diperluas. Juga menambahkan opsi versi V /.
dbenham
9
@benham Ini adalah permata. Mengapa Anda tidak memasangnya di GitHub atau sebagai Gist? Akan membuat versi, tindak lanjut, rilis / distribusi, perbaikan dan lebih mudah. Jika Anda butuh bantuan, beri tahu saya.
Atif Aziz
36

Gunakan FNR

Gunakan fnrutilitas. Ada beberapa kelebihan dibandingkan fart:

  • Ekspresi reguler
  • GUI opsional. Memiliki "Hasilkan tombol baris perintah" untuk membuat teks baris perintah untuk dimasukkan ke file batch.
  • Pola multi-garis: GUI memungkinkan Anda bekerja dengan mudah dengan pola multi-garis. Di FART Anda harus keluar dari jeda baris secara manual.
  • Memungkinkan Anda memilih pengodean file teks. Juga memiliki opsi deteksi otomatis.

Unduh FNR di sini: http://findandreplace.io/?z=codeplex

Contoh penggunaan: fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"

Seorang pria
sumber
1
Ini bagus. Mampu menghasilkan baris perintah dari gui adalah fitur sederhana yang bagus yang membuat saya cepat.
David Hammond
Alat yang sangat berguna. Sudah mencoba FART sebelumnya tetapi dokumentasinya sudah usang.
Artur Kędzior
Alat keren, bahkan mendukung ekspresi reguler. Ini adalah sesuatu yang FART hilang.
Dio Phung
1
Terima kasih telah menunjukkan alat ini. Exe tunggal, pengganti yang bagus untuk FART yang tidak lagi dikembangkan (dan meleset dari regex); dan sintaks PowerShell sangat tidak tertahankan.
Gras Double
Ini paling bermanfaat. Sedang mencari pengganti grep + sed di windows, ini bekerja hebat!
Serbia Tanasa
25

Saya tidak berpikir ada cara untuk melakukannya dengan perintah bawaan. Saya sarankan Anda mengunduh sesuatu seperti Gnuwin32 atau UnxUtils dan gunakan sedperintah (atau unduh saja sed):

sed -c s/FOO/BAR/g filename
Ferruccio
sumber
2
Gunakan cygwin ( cygwin.com ). Ini adalah hal terbaik berikutnya untuk menginstal linux.
Andrew Johnson
Lebih baik jika seseorang dapat memberikan solusi yang tidak bergantung pada menginstal cygwin. Manipulasi string POSIX adalah hal yang sulit - melakukan hal ini pada Windows sedikit lebih tidak jelas.
Rex
4
Gnuwin32 dan UnxUtils adalah binari yang berdiri sendiri yang dibuat untuk Windows. Mereka tidak bergantung pada cygwin.
Ferruccio
1
cygwin: sed -i -b -e 's/FOO/BAR/g' `find . -name *.txt`-i - mengedit file inplace; -b - jangan memproses CR + LF - tanpa opsi ini CR + LF akan dikonversi ke LF
Alexey Vishentsev
@AndrewJohnson Opini dan informasi adalah dua hal yang berbeda.
Preza8
21

Saya tahu saya terlambat ke pesta ..

Secara pribadi, saya suka solusinya di: - http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

Kami juga, menggunakan Fungsi Dedupe secara ekstensif untuk membantu kami mengirim sekitar 500 email setiap hari melalui SMTP dari: - https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o

dan keduanya bekerja secara native tanpa memerlukan alat atau utilitas tambahan.

PENGGANTI:

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 (perhatikan penggunaan -9 untuk nomor ABA):

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

Terima kasih!

Leptonator
sumber
script batch tidak melakukan apa-apa selain menyalin file - juga: mengapa Anda berterima kasih pada diri sendiri?
khusus
Permintaan awal adalah mengganti "FOO" dengan "BAR" dalam file teks menggunakan skrip batch dan dengan fungsi bawaan yang lebih disukai. Jika ada sesuatu saya berterima kasih kepada posting Grup Google saya telah menemukan yang bekerja fantastis dan kami masih menggunakannya sampai hari ini. Juga, lihat posting dan tanggapan seperti ini bermanfaat bagi pengguna yang datang juga. Saya gagal melihat komentar Anda tentang salinan file .. Tentu, itu mengambil konten dari satu file dan menggemakan hasilnya ke file lain, tetapi berdasarkan data, itu memotong dan mem-parsing informasi yang diperlukan. Saya akan merekomendasikan mencobanya terlebih dahulu. ;)
Leptonator
itu pada dasarnya alat file-salinan yang menggantikan dua string statis - Anda bisa menempatkan setidaknya dua variabel di sana sehingga orang yang ingin mencobanya tidak perlu memahami sintaks agar benar-benar dapat menggunakannya - juga: asumsi-asumsi melalui internet hampir selalu sepenuhnya salah. Ingat bahwa.
khusus
4
@specializt - Tolong ... Saya di sini bukan untuk berdebat semantik. Jika Anda suka, bisakah kami membawanya offline ke ruang obrolan.
Leptonator
2
Menurut pendapat saya, ini adalah jawaban untuk pertanyaan awal. Saya akan menggunakan tip ini untuk mengkonfigurasi file inisialisasi untuk layanan selama setup, dan saya tidak ingin mengaktifkan PowerShell, atau membiarkan mesin scripting berjalan di server saya. Begitu sering menjawab pertanyaan yang berkaitan dengan windows, mulailah dengan "instal alat ini dari sana" karena masih ada "PC" di sekitar.
mico
15

Ketika Anda bekerja dengan Git di Windows, cukup jalankan git-bash dan gunakan sed. Atau, saat menggunakan Windows 10, mulai "Bash di Ubuntu pada Windows" (dari subsistem Linux) dan gunakan sed.

Ini adalah editor aliran, tetapi dapat mengedit file secara langsung dengan menggunakan perintah berikut:

sed -i -e 's/foo/bar/g' filename
  • -i Opsi digunakan untuk mengedit di tempat pada nama file.
  • -e Opsi menunjukkan perintah untuk dijalankan.
    • sdigunakan untuk mengganti ekspresi yang ditemukan "foo" dengan "bar" dan gdigunakan untuk mengganti setiap kecocokan yang ditemukan.

Catatan oleh ereOn:

Jika Anda ingin mengganti string dalam file berversi hanya dari repositori Git, Anda mungkin ingin menggunakan:

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

yang bekerja keajaiban.

Jens A. Koch
sumber
1
Perhatikan bahwa jika Anda memang melakukan itu ganti nama dalam repositori git dan hanya ingin mengganti dalam file berversi, Anda mungkin ingin melakukan: git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'yang bekerja dengan sangat baik.
sebelum
13

Saya bermain-main dengan beberapa jawaban yang ada di sini dan lebih suka solusi saya yang lebih baik ...

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

atau jika Anda ingin menyimpan output lagi ke file ...

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

Manfaatnya adalah Anda dapat menyalurkan output dari program apa pun. Akan melihat menggunakan ekspresi reguler dengan ini juga. Tidak dapat menemukan cara membuatnya menjadi file BAT untuk penggunaan yang lebih mudah ... :-(

Simon Timur
sumber
3
Ini solusi yang bagus. Sayangnya, menggunakan typeberarti semua garis yang lebih besar dari 80 karakter terbungkus. Menyedihkan sekali.
sirdank
12

Saya telah menggunakan perl, dan itu bekerja luar biasa.

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

.orig adalah ekstensi yang akan ditambahkan ke file asli

Untuk sejumlah file yang cocok seperti * .html

for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x
Faisal
sumber
Ini adalah solusi yang paling sederhana 1, ketika mengkonversi dari sh untuk kelelawar, hanya mengganti seddengan perl -pi.backup -edan menghargai itu :)
Yann39
11

Dengan replacer.bat

1) Dengan e?opsi yang akan mengevaluasi urutan karakter khusus seperti \n\rdan urutan unicode. Dalam hal ini akan menggantikan yang dikutip "Foo"dan "Bar":

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

2) Langsung mengganti di mana Foodan Bartidak dikutip.

call replacer.bat "C:\content.txt" "Foo" "Bar"
npocmaka
sumber
itu tidak bekerja untuk saya. Bagaimana Anda menjalankan ini? Saya menerima pesan kesalahan 'replace_in_config.bat' tidak dikenali sebagai perintah internal atau eksternal, program yang dapat dijalankan, atau file batch.
FrenkyB
@FrenkyB - perlu berada di direktori yang sama di mana Anda memanggilnya atau di path - ss64.com/nt/path.html
npocmaka
Saya memiliki ketiga file di direktori yang sama.
FrenkyB
9

Inilah solusi yang saya temukan bekerja pada Win XP. Dalam file batch saya yang sedang berjalan, saya menyertakan yang berikut ini:

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

The replace.batfile seperti di bawah ini. Saya tidak menemukan cara untuk memasukkan fungsi itu dalam file batch yang sama, karena %%avariabel selalu memberikan nilai terakhir dalam for loop.

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
Chad
sumber
1
Sayangnya ini juga melompati garis kosong. Sebuah fitur dari {{untuk}} perintah.
John Rocha
7

Lihatlah apakah ada utilitas seperti sed untuk cmd.exe yang meminta sed sederajat di bawah Windows, harus berlaku untuk pertanyaan ini juga. Ringkasan bisnis plan:

  • Itu bisa dilakukan dalam file batch, tapi itu tidak cantik
  • Banyak executable pihak ketiga yang tersedia yang akan melakukannya untuk Anda, jika Anda memiliki kemewahan menginstal atau hanya menyalin di exe
  • Dapat dilakukan dengan VBScript atau serupa jika Anda membutuhkan sesuatu yang dapat dijalankan pada kotak Windows tanpa modifikasi dll.
Jay
sumber
4

Mungkin sedikit terlambat, tetapi saya sering mencari hal yang sama, karena saya tidak ingin melewati rasa sakit karena mendapatkan perangkat lunak yang disetujui.

Namun, Anda biasanya menggunakan pernyataan FOR dalam berbagai bentuk. Seseorang membuat file batch berguna yang melakukan pencarian dan penggantian. Silahkan lihat di sini . Penting untuk memahami keterbatasan file batch yang disediakan. Untuk alasan ini saya tidak menyalin kode sumber dalam jawaban ini.

Peter Schuetze
sumber
4

Dua file batch yang memasok search and replacefungsi telah ditulis oleh anggota Stack Overflow dbenhamdan aacinidigunakan native built-in jscriptdi Windows.

Keduanya robustdan very swift with large filesdibandingkan dengan skrip batch biasa, dan juga simplerdigunakan untuk penggantian teks dasar. Keduanya memiliki Windows regular expressionpencocokan pola.

  1. Ini sed-likefile batch helper disebut repl.bat(oleh dbenham).

    Contoh menggunakan Lsaklar literal:

    echo This is FOO here|repl "FOO" "BAR" L
    echo and with a file:
    type "file.txt" |repl "FOO" "BAR" L >"newfile.txt"
    
  2. Ini grep-likefile batch helper disebut findrepl.bat(oleh aacini).

    Contoh yang memiliki ekspresi reguler aktif:

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

Keduanya menjadi utilitas seluruh sistem yang kuat when placed in a folder that is on the path, atau dapat digunakan dalam folder yang sama dengan file batch, atau dari cmd prompt.

Keduanya memiliki case-insensitivesakelar dan juga banyak fungsi lainnya.

foxidrive
sumber
3

Perintah power shell bekerja seperti mantra

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

Hanya menghadapi masalah yang sama - "Cari dan ganti teks dalam file", tetapi dengan pengecualian bahwa untuk nama file dan pencarian / repalce saya perlu menggunakan regex. Karena saya tidak terbiasa dengan Powershell dan ingin menyimpan pencarian saya untuk digunakan nanti saya butuh sesuatu yang lebih "ramah pengguna" (lebih disukai jika memiliki GUI).

Jadi, sementara Googling :) Saya menemukan alat yang hebat - JAUH (Cari dan Ganti) (bukan KEMUDIAN).

Program kecil itu memiliki GUI yang bagus dan mendukung regex untuk mencari dalam nama file dan di dalam file. Satu-satunya kekurangan adalah bahwa jika Anda ingin menyimpan pengaturan Anda, Anda harus menjalankan program sebagai administrator (setidaknya pada Win7).

madcorp
sumber
Ini jawaban yang sama dengan jawaban dari 2010 @VonC Di utas ini
jeb
@ jeb, saya menunjukkan bahwa FAR bukan FART - dua program berbeda dengan nama yang hampir sama. FAR memiliki GUI dan dapat bekerja dengan regex, sementara dalam komentar di bawah ini yang benang orang menyebutkan bahwa Kentut tidak regex dukungan.
madcorp
3

Saya lebih suka menggunakan seddari utilitas GNU untuk Win32 , berikut ini perlu diperhatikan

  • kutipan tunggal ''tidak akan bekerja di windows, gunakan ""saja
  • sed -itidak akan bekerja di windows, itu akan membutuhkan pertukaran file

Jadi kode kerja seduntuk menemukan dan mengganti teks dalam file di windows adalah seperti di bawah ini

sed -e "s/foo/bar/g" test.txt > tmp.txt && mv tmp.txt test.txt
Chetabahana
sumber
2
Sebelum pengguna Windows segera melakukan pertukaran file: versi terbaru dengan dukungan di tempat dengan mengedit -i! Jika versi sed Anda melakukannya, maka periksa perintah dari jawaban ini: stackoverflow.com/a/33762001/2492801 .
Benjamin Bihler
2

Ini adalah satu hal yang tidak dilakukan dengan baik dalam skrip batch.

Skrip morechilli yang ditautkan akan berfungsi untuk beberapa file, tetapi sayangnya itu akan mencekik yang berisi karakter seperti pipa dan ampersand.

VBScript adalah alat bawaan yang lebih baik untuk tugas ini. Lihat artikel ini untuk contoh: http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx


sumber
2

@Rachel memberikan jawaban yang sangat baik tetapi di sini ada variasi untuk membaca konten ke $datavariabel PowerShell . Anda kemudian dapat dengan mudah memanipulasi konten beberapa kali sebelum menulis ke file output. Juga lihat bagaimana nilai multi-line diberikan dalam file batch .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%"
Siapa
sumber
2

Gunakan PowerShell di .bat - untuk Windows 7+

encoding utf8 adalah opsional, bagus untuk situs web

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

Unduh Cygwin (gratis) dan gunakan perintah seperti unix di baris perintah Windows.

Taruhan terbaik Anda: sed

jm.
sumber
10
Cygwin itu jahat. Jangan pasang itu. Lebih baik gunakan UnixUtils yang disebutkan di bawah ini.
zedoo
24
Apa yang jahat tentang itu?
jm.
@ Jm Mungkin karena Anda harus menginstal semuanya bersama daripada menggunakan satu executable kapan pun Anda mau.
Andry
Lebih baik gunakan powershell, ini sebenarnya built-in di windows.
Preza8
0

Dapat juga melihat alat Replace dan ReplaceFilter di https://zoomicon.github.io/tranXform/ (termasuk sumber). Yang ke-2 adalah filter.

Alat yang menggantikan string dalam file ada di VBScript (membutuhkan Windows Script Host [WSH] untuk dijalankan dalam versi Windows lama)

Filter mungkin tidak bekerja dengan Unicode kecuali Anda mengkompilasi ulang dengan Delphi terbaru (atau dengan FreePascal / Lazarus)

George Birbilis
sumber
-5

Saya telah menghadapi masalah ini beberapa kali saat coding di bawah Visual C ++. Jika sudah, Anda dapat menggunakan Visual studio Find and Replace Utility. Ini memungkinkan Anda untuk memilih folder dan mengganti konten file apa pun di folder itu dengan teks lain yang Anda inginkan.

Di bawah Visual Studio: Edit -> Temukan dan Ganti Dalam dialog yang dibuka, pilih folder Anda dan isi kotak "Temukan Apa" dan "Ganti Dengan". Semoga ini bisa membantu.

Nadjib
sumber
2
Nadjib, jawaban Anda tidak membantu pengguna karena Anda menganggap mereka menggunakan perangkat lunak yang tidak mereka sebutkan. Harap sarankan opsi yang tidak memerlukan perangkat lunak.
Aibrean
@ Aibrean jawabannya tidak ada gunanya, tetapi tidak untuk alasan itu, itu adalah titik masuk yang salah.
Paul