Regex Ganti dari Baris perintah

21

Apakah mungkin untuk mengganti regex dari baris perintah? Saat ini saya menggunakan notepad ++ untuk melakukan ini. Pada baris perintah saya hanya dapat menggunakan FINDSTR yang hanya dapat menemukan file / baris yang telah diedit.

EDIT:
Mungkin akan dimungkinkan untuk membuat skrip VB dan menjalankannya dari cmd? Saya baru saja membuat file "hi.vbs" dengan kontennya

Msgbox "Hi Buddy"

Kemudian cmd memungkinkan saya untuk menjalankannya secara langsung dengan mengetikkan "hai" dari baris perintah.
Jadi jika tidak mungkin dengan skrip batch, maka saya dapat menggunakan skrip VB melalui batch. Atau..?

Aziz
sumber
Pada akhirnya Anda meletakkan kalimat yang tidak meyakinkan dan seluruh bagian EDIT tidak menunjuk ke masalah lebih seperti "Saya membuat dunia halo dalam vb, dapatkah saya membuat sesuatu seperti itu dalam batch? Periksa jawaban yang diposting oleh @IanPugsley adalah cara mudah untuk melakukan regex-replace
mjsr
@ Aziz: apakah ada jawaban yang cocok untuk Anda? Jika demikian, apakah Anda akan menerimanya? Itu bagian dari berpartisipasi dalam komunitas ini; cara kami saling berterima kasih atas bantuan. Poin reputasi yang diberikan untuk jawaban yang diterima membantu pengguna lain menilai pengalaman satu sama lain. Terima kasih.
JRobert
Saya berpikir untuk memanggil sesuatu seperti MYVBREPLACE (.vbs) FILENAME REGEXPATTERN REPLACEMENT dari baris perintah.
Aziz

Jawaban:

11

buka di sini
http://gnuwin32.sourceforge.net/packages.html
gulir ke bawah ke SED. Unduh coreutils juga saat Anda menggunakannya.

perintah ini akan menggantikan a dengan b secara global, dan pada setiap baris. jadi bukan hanya kejadian pertama di telepon.

mis. menggunakan sed "s / a / b / g" a.txt

C:\>type a.txt
aaaa
aaa

C:\>sed "s/a/b/" a.txt
baaa
baa

C:\>sed "s/a/b/g" a.txt
bbbb
bbb

C:\>

VBScript memang mendukung ekspresi reguler, Anda dapat menemukan dan menggantinya.

dim re, s
set re = new RegExp

re.Pattern="in"
re.Global=True 'false is default
s="bin din in"
MsgBox re.Replace(s,"xxx")

Menampilkan bxxx dxxx xxx

barlop
sumber
Alat gila yang luar biasa !!! Alat ini terlalu dipaksakan. Saya belum bisa menggunakannya, tetapi ketika saya membaca gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command saya dapat melihat bahwa ini dapat melakukan lebih dari yang saya harapkan. Terima kasih banyak
Aziz
Versi baru bash juga dapat melakukan ekspresi reguler, terkadang itu cukup untuk tugas-tugas sederhana dan tidak perlu menggunakan bahkan sed.
vtest
dan ulangi apa yang dikatakan vtest, kalau-kalau ada yang tidak tahu. cygwin memiliki bash.
barlop
sed menyebalkan dengan pengganti multi-line
kofifus
1
@KennyEvitt cmd shell memerlukan tweak untuk menampilkannya dan menggunakan chcp untuk unicode utf8 chcp 65001 (seperti yang Anda katakan, utf16 encoding.chcp 1200 dan chcp 12001 tidak didukung) stackoverflow.com/questions/9321419/… Tidak yakin mintty. Tidak yakin ulang PowerShell. Tetapi utf-8 didukung ok dalam cmd atau PowerShell. Selama font pendukung digunakan seperti kurir baru, dan selama itu codepage 65001. Ada cmd / u untuk pengkodean utf16.
barlop
26

Saya telah menulis alat baris perintah gratis untuk Windows untuk melakukan ini. Ini disebut rxrepl , mendukung Unicode dan pencarian file. Beberapa mungkin menemukan itu alat yang berguna.

rxrepl adalah alat baris perintah Microsoft Windows untuk mencari dan mengganti teks dalam file teks menggunakan Perl regular regular expressions (PCRE).

Ini memiliki beberapa fitur berikut:

  • Cari menggunakan Ekspresi Reguler Kompatibel yang Kompatibel
  • Gunakan pencocokan grup dalam teks pengganti
  • Mendukung ujung jalur Windows dan Unix
  • Dukungan Unicode
  • Menerima beberapa pencarian / ganti argumen
  • Opsi dapat disediakan dalam file opsi
  • Pindai file
  • Mode pratinjau
  • Mode pencocokan file baris dan penuh

masukkan deskripsi gambar di sini

pengguna2005187
sumber
4
Ini luar biasa! Jika Anda seperti saya dan perlu contoh, ini menggantikan "foobar" dengan "foofighters" dalam file: rxrepl.exe -f file.txt -a -s "(foo) bilah" -r "\ 1fighters"
Dunc
1
Juga, apakah Anda kebetulan memiliki sumber pada sesuatu seperti github? Benar-benar dapat dimengerti jika itu tidak dimaksudkan sebagai open source, tapi saya sangat penasaran.
kayleeFrye_onDeck
1
@Steztric Benarkah? Saya menjalankan windows 64-bit dan sepertinya tidak memiliki masalah menjalankan ini dariC:\WINDOWS\System32\cmd.exe
kayleeFrye_onDeck
1
Alat luar biasa! Berjalan tanpa masalah di bawah Windows Server Std 2012 R2 x64. Terima kasih!
kwrl
2
Alat yang hebat, saya harap Anda masih mempertahankannya
encer
12

The Scripting Guy mencakup cara melakukan ini di PowerShell (tidak ada unduhan tambahan pada OS Windows terbaru, Anda mungkin sudah menginstalnya).

Mulai, jalankan yang berikut (untuk mengganti *dengan a @):

(Get-Content C:\Scripts\Test.txt) | 
Foreach-Object {$_ -replace "\*", "@"} | 
Set-Content C:\Scripts\Test.txt

Ini mendukung .NET regular expressions , termasuk pandangan positif dan negatif, dan segala hal yang notepad ++ tidak mendukung dengan regex sebelum versi 6.x (sebanyak yang saya suka notepad ++).

Ian Pugsley
sumber
1
Notepad ++ mendukung PCRE lengkap pada versi 6.
Bob
5

Saya telah menemukan fnr.exe untuk itu. Ini memiliki GUI dan baris perintah.

Alat sumber terbuka untuk menemukan dan mengganti teks dalam banyak file.

fitur

  • Unduhan file tunggal - fnr.exe (127 kb)
  • Ganti teks dalam banyak file menggunakan aplikasi windows atau melalui baris perintah
  • Temukan Hanya untuk melihat di mana kecocokan ditemukan
  • Pencarian case-sensitive
  • Mencari file dalam satu direktori atau mengulang sub-direktori
  • Ekspresi reguler
  • Temukan dan ganti teks multi-baris
  • Hasilkan tombol baris perintah untuk membuat teks baris perintah untuk dimasukkan ke file batch
  • Bantuan baris perintah
  • Tes unit mesin Find / Replace

Melihat opsi baris perintah

masukkan deskripsi gambar di sini

Sergius
sumber
1
Cukup bagus - Anda dapat memeriksa pernyataan "temukan" di GUI, klik "Gen Replace Command Line" dan bersiap untuk menggunakan panggilan baris perintah. Tidak perlu menghabiskan waktu untuk membiasakan diri dengan sintaks baris perintah.
sarh
Saya tidak bisa mengatur agar ini keluar setelah melakukan perubahan. Saya harus menekan enter untuk menutup sehingga ini tidak terlalu berguna untuk skrip
G-.
@ G-. Tidak ada menunggu <enter> jika dijalankan dari file batch.
Sergius
Saya tidak dapat menemukan cara untuk menampilkan ke nama file / ekstensi yang berbeda
Rick
4

Sepertinya Anda dapat menggunakan regex dengan FINDSTR

findstr [Windows CMD] :

findstr memungkinkan untuk mencari teks (seperti yang ditentukan dengan pola dalam nama file file. Jika nama file berisi wildcard (* atau?), ia mencari di semua file yang cocok. Opsi / S mencari di direktori saat ini serta dalam subdirektori nya. Jika pola berisi spasi, harus ditentukan seperti / C: "beberapa teks yang akan dicari". Untuk mengubah pola menjadi ekspresi reguler, opsi / R harus digunakan. Opsi / I mencari case tidak peka.

Dari Bantuan FindStr ( Findstr /?):

/ R - Menggunakan string pencarian sebagai ekspresi reguler.

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurrences of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line
  [class]  Character class: any one character in set
  [^class] Inverse class: any one character not in set
  [x-y]    Range: any characters within the specified range
  \x       Escape: literal use of metacharacter x
  \<xyz    Word position: beginning of word
  xyz\>    Word position: end of word
p0rkjello
sumber
Terima kasih atas jawaban Anda, tetapi ini bukan pertanyaan saya.
Aziz
2
findstrtidak dapat mengganti teks dalam file!
Kenny Evitt
4

Saya sedikit terlambat ke pesta, tetapi JREPL.BAT adalah utilitas regex berbasis skrip JScript / batch hybrid yang berjalan secara native pada mesin Windows mulai XP dan seterusnya.

Dokumentasi lengkap dibangun ke dalam skrip, yang dapat diakses melalui JREPL /?, atau digunakan JREPL /??untuk output halaman.

JREPL menggunakan regex ECMA standar yang datang dengan JScript. Regex ECMA tidak sekuat regex .NET yang tersedia untuk PowerShell, tetapi masih sangat bagus. Dan saya pikir rata-rata pengguna akan menemukan utilitas ini lebih mudah digunakan daripada PowerShell.

Opsi JREPL bawaan sudah menyediakan banyak daya yang melekat, tetapi kemampuan untuk menyuntikkan JScript yang disediakan pengguna benar-benar membuka kemungkinan luar biasa.

Saya mengembangkan skrip karena tempat kerja saya tidak mengizinkan pengunduhan file exe non-standar, tetapi tidak memiliki batasan pada penulisan batch atau skrip JScript :-)

Cukup ikuti tautan dan salin kode skrip ke file bernama JREPL.BAT. Baca posting selanjutnya dari utas itu untuk contoh penggunaan dan riwayat pengembangan. Ada juga banyak jawaban StackOverflow yang menggunakan JREPL.BAT.

dbenham
sumber
3

Dua pilihan bagus adalah Cygwin yang akan memberi Anda lingkungan mirip-Unix, mirip-bash (alternatif dari cmd.exe); dan Unxutils , Win32 port dari kumpulan utilitas Unix individual. Di kedua paket, lihat 'sed', 'awk', dan 'grep'.

JRobert
sumber
2
unxutils sudah tua. sekarang masalahnya adalah gnuwin32
barlop
Terima kasih JRobert atas saran Anda. Maaf saya tidak menggantinya, tapi sekarang saya bisa melihat bahwa SED adalah masalahnya.
Aziz
@barlop pada 2018, gnuwin32 sekarang juga sudah tua .. cygwin lebih mutakhir!
barlop
0

Anda juga dapat menggunakan GSAR untuk melakukan pencarian dan penggantian baris perintah. Bekerja dengan hex dan binary juga. Ini tidak akan melakukan pengangkatan berat kompleks yang dapat dilakukan regex, tetapi untuk pencarian dasar dan penggantian, ia melakukan pekerjaan dengan cepat dan mudah.

Matahari
sumber