Apakah ada utilitas seperti sed untuk cmd.exe? [Tutup]

149

Saya ingin secara terprogram mengedit konten file menggunakan baris perintah windows ( cmd.exe ). Di * nix ada sed untuk tugas ini. Apakah ada padanan asli yang berguna di windows?

Jakub Šturc
sumber
1
Apa yang Anda maksud dengan "asli" ??? Dapat diinstal untuk bekerja di cmd.exe, atau bekerja tanpa instalasi apa pun? Jika yang pertama, lihat GnuWin32 ref'd di bawah; jika yang terakhir, tidak. Tidak ada sed bawaan asli untuk windows.
Michael Paulukonis
6
Maksud saya solusi yang berjalan pada semua windows tanpa menginstal hal-hal tambahan.
Jakub Šturc
1
Tinggalkan cmd.exe di belakang dan gunakan PowerShell sebagai gantinya.
Bill_Stewart
Terkait: stackoverflow.com/questions/60034/…
AlikElzin-kilaka
Jika Anda hanya ingin menghapus baris tertentu dari file, gunakan FIND /?
John Henckel

Jawaban:

117

Hari ini Powerhell menyelamatkan saya.

Karena grepada:

get-content somefile.txt | where { $_ -match "expression"}

atau

select-string somefile.txt -pattern "expression"

dan untuk itu sedada:

get-content somefile.txt | %{$_ -replace "expression","replace"}

Untuk detail lebih lanjut lihat entri blog Zain Naboulsis .

Jakub Šturc
sumber
12
Selain itu: jika Anda ingin memanggilnya dari cmd normal, cukup @powershell -Command "get-content ...". Satu-satunya peringatan adalah bahwa Anda harus menghindari tanda kutip: ... -Command "get-content ... \" expression \ ", ..."
Tarc
1
@Tarc AFAIR, Anda dapat menggunakan tanda kutip tunggal dalam perintah Anda dan menggunakan tanda kutip ganda untuk mengutip perintah
2
Saya mencoba ini hari ini pada file untuk menghapus beberapa hal di antara tanda kutip di tempat-tempat tertentu, hanya untuk menemukan bahwa output adalah file hampir dua kali lebih besar dari aslinya. Alasannya tampaknya karena metode ini mengubah cara baris baru ditangani dalam file untuk menggunakan "\ r \ n" bukannya "\ n".
user132278
1
Menggandakan karena \ r \ n akan menyiratkan bahwa file Anda hanya terdiri dari baris baru. Inilah alasan sebenarnya: penyandian .
Amit Naidu
2
@ and-bri (Dapatkan-Konten c: \ temp \ test.txt) .replace ('[MYID]', 'MyValue') | Set-Konten c: \ temp \ test.txt
AFP_555
95

sed (dan sejenisnya) terkandung dalam beberapa paket perintah Unix.

Jika Anda tidak ingin menginstal apa pun dan sistem Anda bukan Windows Server, maka Anda dapat menggunakan bahasa scripting (mis. VBScript) untuk itu. Di bawah ini adalah tusukan kasar, manset itu. Baris perintah Anda akan terlihat seperti

cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt

di mana oldpat dan newpat adalah pola regex Microsoft vbscript . Jelas saya hanya menerapkan perintah pengganti dan mengasumsikan beberapa hal, tetapi Anda bisa menyempurnakannya agar menjadi lebih pintar dan lebih memahami garis sedperintah.

Dim pat, patparts, rxp, inp
pat = WScript.Arguments(0)
patparts = Split(pat,"/")
Set rxp = new RegExp
rxp.Global = True
rxp.Multiline = False
rxp.Pattern = patparts(1)
Do While Not WScript.StdIn.AtEndOfStream
  inp = WScript.StdIn.ReadLine()
  WScript.Echo rxp.Replace(inp, patparts(2))
Loop
bw
sumber
1
Ini bukan apa yang saya inginkan namun saya percaya bahwa ketergantungan pada VBS adalah solusi paling ringan.
Jakub Šturc
7
GnuWin32 adalah solusi asli, jika dengan asli yang Anda maksud dirancang untuk berjalan di lingkungan windows "normal" (tidak seperti CygWin). Cobalah, dan Anda akan mulai mengharapkan mereka berada di SETIAP sistem windows yang Anda gunakan. !!!
Michael Paulukonis
3
Bekerja untuk kasus saya! Juga, jangan lupa opsi cscript "// NoLogo".
Marko Dumic
4
Jika ini "tidak jelas", pikirkan seperti apa kode Anda yang lain! Luar biasa, terima kasih.
Sabuncu
2
Utilitas pencarian dan penggantian regex yang serupa dapat dilakukan dengan JScript. Keuntungan dari JScript dibandingkan VBScript adalah ia dapat dengan mudah dikombinasikan dengan batch dalam satu script, membuat utilitas lebih mudah digunakan dalam konteks batch atau baris perintah. Utilitas JScript / batch hybrid kuat yang disebut REPL.BAT tersedia . Ini memiliki banyak opsi baris perintah. Dokumentasi lengkap tertanam dalam skrip. Itu tentu tidak memiliki kemampuan sed penuh, tetapi meskipun begitu, itu cukup kuat.
dbenham
17

Jika Anda tidak ingin menginstal apa pun (saya berasumsi Anda ingin menambahkan skrip ke beberapa solusi / program / dll yang akan dijalankan di komputer lain), Anda dapat mencoba membuat skrip vbs (katakanlah, 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
objFile.Close

Dan Anda menjalankannya seperti ini:

cscript replace.vbs "C:\One.txt" "Robert" "Rob"

Yang mirip dengan versi sed yang disediakan oleh "penenun tagihan", tapi saya pikir yang ini lebih ramah dalam hal karakter khusus ('> </).

Btw, saya tidak menulis ini, tapi saya tidak ingat dari mana saya mendapatkannya.

Rober
sumber
10

Ada Super Sed versi sed ditingkatkan. Untuk Windows, ini adalah .exe mandiri, yang dimaksudkan untuk berjalan dari baris perintah.

Rob Kam
sumber
8
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt

Ini adalah perilaku

sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
krogon
sumber
1
Ini bekerja dengan sempurna. Catatan: tanda kurung pada "get-content" memastikan bahwa file tidak akan digunakan nanti ketika "set-content" akan dipanggil.
Kafu
apakah mungkin ada yang serupa di cmd? di pahami ini hanya untuk pwsh
Ferroao
Apakah 'SourceRegexp' harus diganti oleh regex yang memungkinkan? apakah itu benar-benar berfungsi pada power shell?
scjorge
7

Anda bisa mencoba PowerShell. Ada commandlets get-content dan set-content yang bisa Anda gunakan.

James Boother
sumber
4
Itu mungkin adalah dua hal di PowerShell yang berkontribusi paling sedikit pada apa yang seddilakukan ;-). The -replaceOperator mungkin saran yang lebih baik.
Joey
7

Coba fart.exe. Ini adalah utilitas Find-and-replace-text yang dapat digunakan dalam program kumpulan perintah.

http://sourceforge.net/projects/fart-it/

Colin Nicholls
sumber
Jika saya benar-benar tidak dapat menggunakan shell * nix, saya lebih suka ini karena ini adalah exe mandiri kecil tanpa dependensi.
Qben
6

Saya menggunakan Cygwin . Saya bertemu dengan banyak orang yang tidak menyadari bahwa jika Anda meletakkan binari Cygwin di PATH Anda, Anda dapat menggunakannya dari dalam shell Windows Command. Anda tidak harus menjalankan Bash Cygwin.

Anda mungkin juga melihat Layanan Windows untuk Unix yang tersedia dari Microsoft (tetapi hanya pada versi Windows Profesional dan di atas).

Brandon DuRette
sumber
4

edlin atau edit

ditambah ada Windows Services for Unix yang dilengkapi dengan banyak alat unix untuk windows. http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx

Pembaruan 12/7/12 Di Windows 2003 R2, Windows 7 & Server 2008, dll. Di atas diganti oleh Subsystem untuk Aplikasi Berbasis UNIX (SUA) sebagai tambahan. Tetapi Anda harus mengunduh utilitas: http://www.microsoft.com/en-us/download/details.aspx?id=2391

Booji Boy
sumber
5
Keduanya tidak ada lagi di Windows versi 64-bit.
Joey
3

Anda dapat melihat Alat GNU , mereka menyediakan (di antara hal lain) di windows.

Linor
sumber
3

Ada file batch pembantu untuk Windows yang disebut repl.batyang memiliki banyak kemampuan tetapi doesn't require any additional downloadinstalasi SED . Ini adalah file kumpulan hybrid yang digunakan Jscriptuntuk mengimplementasikan fitur dan begitu juga swift, dandoesn't suffer from the usual poison characters pemrosesan batch dan menangani baris kosong dengan mudah.

Unduh repldari - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

Penulis adalah @dbenham dari stack overflow dan dostips.com

File batch pembantu lain yang disebut findrepl.batmemberi pengguna Windows banyak kemampuan GREPdan juga didasarkan padaJscript dan juga file batch hybrid. Ini berbagi manfaat dari repl.bat

Unduh findrepldari - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

Penulis adalah @aacini dari stack overflow dan dostips.com

foxidrive
sumber
Tautan dropbox untuk repl turun. Apakah Anda memiliki tautan sekunder?
Vishal Anand
2

Sejauh yang saya tahu tidak ada sed yang dibundel dengan windows. Namun, sed tersedia untuk Windows dalam beberapa bentuk yang berbeda, termasuk sebagai bagian dari Cygwin, jika Anda ingin subsistem POSIX penuh, atau sebagai Win32 yang dapat dieksekusi asli jika Anda ingin menjalankan hanya sed pada baris perintah.

Sed untuk Windows (Proyek GnuWin32)

Jika perlu asli Windows maka satu-satunya hal yang saya sarankan adalah menggunakan bahasa scripting yang didukung oleh Windows tanpa add-on, seperti VBScript.

Jay
sumber
1

Cygwin bekerja, tapi ini utilitas juga tersedia. Cukup taruh di drive Anda, masukkan direktori ke jalur Anda, dan Anda memiliki banyak utilitas unix yang ramah. IMHO lebih ringan bahwa Cygwin (meskipun itu bekerja dengan baik).

Menandai
sumber
0

Saya membutuhkan alat sed yang bekerja untuk Windows cmd.exe prompt. Port Eric Pement dari sed ke .exe DOS tunggal bekerja sangat baik untuk saya.

Ini didokumentasikan dengan cukup baik .

bryan kennedy
sumber
1
Pertanyaannya adalah tentang Windows (cmd.exe) bukan tentang DOS
a_horse_with_no_name
@ Howhowie: Begitu. Meskipun beberapa jawaban ini mungkin berguna bagi seseorang, saya setuju bahwa pertanyaan itu sendiri tidak cocok untuk SO. OTOH, saya tidak merasa memenuhi syarat untuk merekomendasikan penghapusan grosir.
PM 2Ring
Dalam situasi ini saya pikir akan sulit untuk memasukkan bagian-bagian penting dari jawaban, karena bagian esensial adalah file .exe yang di-host di halaman tertaut. Saya benar-benar mengerti kekhawatiran tentang link-rot, saya hanya tidak yakin bagaimana saya bisa membuat ini mandiri ke SO.
bryan kennedy
Terima kasih atas tangkapannya, a_horse_with_no_name. Saya ceroboh dengan bahasa saya. Saya mengedit komentar saya untuk memperbaiki masalah yang Anda tunjukkan.
bryan kennedy