Anda dapat melakukan sesuatu yang kasar dengan skrip Perl kecil yang diperintahkan untuk melakukan penggantian baris demi baris ( -l -pe
) pada file yang diteruskan sebagai argumen ( -i
):
perl -i -l -pe '
if (/from/) { # is the source text present on this line?
printf STDERR ("%s: %s [y/N]? ", $ARGV, $_); # display a prompt
$r=<STDIN>; # read user response
if ($r =~ /^[Yy]/) { # if user entered Y:
s/from/to/g; # replace all occurences on this line
}' /path/to/files
Peningkatan yang mungkin dilakukan adalah mewarnai bagian prompt dan mendukung hal-hal seperti "ganti semua kejadian di file saat ini". Meminta secara terpisah untuk setiap kemunculan pada sebuah garis akan lebih sulit.
Bagian kedua, mencocokkan file. jika tidak terlalu banyak file yang terlibat dan Anda menjalankan zsh, Anda dapat mencocokkan semua file di direktori saat ini dan subdirektori secara rekursif:
perl -i -l -pe '…' **/*(.)
Jika shell Anda adalah bash ≥4, Anda dapat menjalankan perl … **/*
, tetapi itu akan menghasilkan pesan kesalahan palsu karena sed akan mencoba (dan gagal) untuk berjalan pada direktori. Jika Anda hanya ingin melakukan penggantian dalam satu set file seperti file C, Anda dapat membatasi kecocokan (yang bekerja pada bash ≥4 atau zsh):
perl -i -l -pe '…' **/*.[hc]
Jika Anda perlu kontrol yang lebih baik atas file mana yang Anda ganti, atau shell Anda tidak memiliki konstruksi pencocokan direktori rekursif **
, atau jika Anda memiliki terlalu banyak file dan mendapatkan kesalahan "baris perintah terlalu lama", gunakan find
. Misalnya, untuk melakukan penggantian di semua file bernama *.h
atau *.c
di direktori saat ini dan subdirektori (pada sistem yang lebih lama, Anda mungkin perlu menggunakan \;
alih-alih +
di akhir baris ( +
formulir lebih cepat tetapi tidak tersedia di mana-mana).
find . -type f -name '*.[hc]' -exec perl -i -l -pe '…' {} +
Yang sedang berkata, saya akan tetap menjadi editor interaktif jika Anda membutuhkan interaksi. Gert telah menunjukkan cara untuk melakukan ini di Vim , meskipun itu mengharuskan membuka semua file yang ingin Anda cari, yang mungkin menjadi masalah jika ada banyak.
Di Emacs, inilah cara Anda dapat melakukan ini:
- Kumpulkan nama file dengan
M-x find-name-dired
(tentukan direktori tingkat atas) atau M-x find-dired
(tentukan find
baris perintah arbitrer ).
- Di buffer dired yang dihasilkan , tekan
t
untuk menandai semua file, lalu Q
( dired-do-query-replace-regexp
) untuk melakukan penggantian dengan meminta pada file yang ditandai.
s/from/to/g
dengan kesalahan pemformatan setelahnya, bukans/from/to/gc
dengan penekanan padac
saat Anda berusaha menulis (Anda tidak dapat melakukannya dengan Markdown, Anda bisa melakukannya dengan<code>
dan<strong>
tag HTML).