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?
492
echo(%text:%search%=%replace%%)
Jawaban:
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:
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 isimyFile.txt
(gc
kependekan dariGet-Content
perintah)-replace 'foo', 'bar'
hanya menjalankan mengganti perintah untuk menggantifoo
denganbar
| Out-File myFile.txt
menyalurkan output ke filemyFile.txt
-encoding ASCII
mencegah menyalin file output ke unicode, seperti komentar menunjukkanPowershell.exe seharusnya sudah menjadi bagian dari pernyataan PATH Anda, tetapi jika tidak, Anda dapat menambahkannya. Lokasi itu di komputer saya
C:\WINDOWS\system32\WindowsPowerShell\v1.0
sumber
-encoding ASCII
atauUTF8
atau apa pun yang diperlukan. Berhati-hatilah, jika Anda menargetkan UTF8, ia mungkin memperkenalkan Tanda Pesanan Byte di awal file yang tidak muncul dalam aslinya.-encoding ASCII
. Bagi siapa pun yang membutuhkannya di masa depan, itu akan menjadiOut-File -encoding ASCII myFile.txt
Set-Content
alih-alihOut-File
.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.
sumber
powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
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:
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ç
sumber
/
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/
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.
Output Skrip:
ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
sumber
Buat file replace.vbs:
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 "
sumber
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
.BatchSubstitute.bat
di dostips.com adalah contoh pencarian dan penggantian menggunakan file batch murni.Ini menggunakan kombinasi dari
FOR
,FIND
danCALL SET
.Baris yang mengandung karakter di antara
"&<>]|^
dapat diperlakukan secara tidak benar.sumber
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
/UTF
opsi, 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:
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
M
danX
memungkinkan modifikasi file biner! OpsiM
Multi-line memungkinkan pencarian di beberapa baris. TheX
pilihan 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.
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:
Seperti biasa, dokumentasi lengkap tertanam dalam skrip.
Solusi sepele yang asli sekarang bahkan lebih sederhana:
Versi JREPL.BAT saat ini tersedia di DosTips . Baca semua posting berikutnya di utas untuk melihat contoh penggunaan dan riwayat pengembangan.
sumber
\q
untuk mewakili"
, dan Cari literal sekarang mendukung semua urutan pelarian yang diperpanjang ketika opsi L dan X digabungkan.Gunakan FNR
Gunakan
fnr
utilitas. Ada beberapa kelebihan dibandingkanfart
: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"
sumber
Saya tidak berpikir ada cara untuk melakukannya dengan perintah bawaan. Saya sarankan Anda mengunduh sesuatu seperti Gnuwin32 atau UnxUtils dan gunakan
sed
perintah (atau unduh sajased
):sumber
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 LFSaya 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:
DEDUPLICATOR (perhatikan penggunaan -9 untuk nomor ABA):
Terima kasih!
sumber
Ketika Anda bekerja dengan Git di Windows, cukup jalankan
git-bash
dan gunakansed
. Atau, saat menggunakan Windows 10, mulai "Bash di Ubuntu pada Windows" (dari subsistem Linux) dan gunakansed
.Ini adalah editor aliran, tetapi dapat mengedit file secara langsung dengan menggunakan perintah berikut:
-i
Opsi digunakan untuk mengedit di tempat pada nama file.-e
Opsi menunjukkan perintah untuk dijalankan.s
digunakan untuk mengganti ekspresi yang ditemukan "foo" dengan "bar" dang
digunakan 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.
sumber
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
yang bekerja dengan sangat baik.Saya bermain-main dengan beberapa jawaban yang ada di sini dan lebih suka solusi saya yang lebih baik ...
atau jika Anda ingin menyimpan output lagi ke file ...
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 ... :-(
sumber
type
berarti semua garis yang lebih besar dari 80 karakter terbungkus. Menyedihkan sekali.Saya telah menggunakan perl, dan itu bekerja luar biasa.
.orig adalah ekstensi yang akan ditambahkan ke file asli
Untuk sejumlah file yang cocok seperti * .html
sumber
sed
denganperl -pi.backup -e
dan menghargai itu :)Dengan replacer.bat
1) Dengan
e?
opsi yang akan mengevaluasi urutan karakter khusus seperti\n\r
dan urutan unicode. Dalam hal ini akan menggantikan yang dikutip"Foo"
dan"Bar"
:2) Langsung mengganti di mana
Foo
danBar
tidak dikutip.sumber
Inilah solusi yang saya temukan bekerja pada Win XP. Dalam file batch saya yang sedang berjalan, saya menyertakan yang berikut ini:
The
replace.bat
file seperti di bawah ini. Saya tidak menemukan cara untuk memasukkan fungsi itu dalam file batch yang sama, karena%%a
variabel selalu memberikan nilai terakhir dalam for loop.replace.bat
:sumber
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:
sumber
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.
sumber
Dua file batch yang memasok
search and replace
fungsi telah ditulis oleh anggota Stack Overflowdbenham
danaacini
digunakannative built-in jscript
di Windows.Keduanya
robust
danvery swift with large files
dibandingkan dengan skrip batch biasa, dan jugasimpler
digunakan untuk penggantian teks dasar. Keduanya memilikiWindows regular expression
pencocokan pola.Ini
sed-like
file batch helper disebutrepl.bat
(oleh dbenham).Contoh menggunakan
L
saklar literal:Ini
grep-like
file batch helper disebutfindrepl.bat
(oleh aacini).Contoh yang memiliki ekspresi reguler aktif:
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-insensitive
sakelar dan juga banyak fungsi lainnya.sumber
Perintah power shell bekerja seperti mantra
sumber
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).
sumber
Saya lebih suka menggunakan
sed
dari utilitas GNU untuk Win32 , berikut ini perlu diperhatikanJadi kode kerja
sed
untuk menemukan dan mengganti teks dalam file di windows adalah seperti di bawah inisumber
-i
! Jika versi sed Anda melakukannya, maka periksa perintah dari jawaban ini: stackoverflow.com/a/33762001/2492801 .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
@Rachel memberikan jawaban yang sangat baik tetapi di sini ada variasi untuk membaca konten ke
$data
variabel 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.sumber
Gunakan PowerShell di .bat - untuk Windows 7+
encoding utf8 adalah opsional, bagus untuk situs web
sumber
Unduh Cygwin (gratis) dan gunakan perintah seperti unix di baris perintah Windows.
Taruhan terbaik Anda: sed
sumber
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)
sumber
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.
sumber