Maksud Anda mencari dan mengganti string di semua file yang cocok dengan grep?
perl -p -i -e 's/oldstring/newstring/g' `grep -ril searchpattern *`
Edit
Karena ini sepertinya pertanyaan yang cukup populer, saya pikir saya akan memperbarui.
Saat ini saya kebanyakan menggunakan ack-grep
karena lebih user-friendly. Jadi perintah di atas adalah:
perl -p -i -e 's/old/new/g' `ack -l searchpattern`
Untuk menangani spasi kosong dalam nama file, Anda dapat menjalankan:
ack --print0 -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
Anda dapat melakukan lebih banyak hal dengan ack-grep
. Katakanlah Anda ingin membatasi pencarian hanya untuk file HTML:
ack --print0 --html -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
Dan jika ruang putih tidak menjadi masalah, itu bahkan lebih pendek:
perl -p -i -e 's/old/new/g' `ack -l --html searchpattern`
perl -p -i -e 's/old/new/g' `ack -f --html` # will match all html files
Tampaknya inilah yang Anda inginkan, berdasarkan contoh yang Anda berikan:
sed -i 's/foo/bar/g' *
Itu tidak rekursif (tidak akan turun ke subdirektori). Untuk solusi bagus mengganti file yang dipilih di seluruh pohon, saya akan menggunakan find:
find . -name '*.html' -print -exec sed -i.bak 's/foo/bar/g' {} \;
*.html
adalah ekspresi yang harus cocok dengan file, .bak
setelah -i
membuat salinan dari file asli, dengan ekstensi .bak (bisa ekstensi apa pun yang Anda suka) dan g
di akhir ekspresi sed memberitahu sed untuk mengganti banyak salinan pada satu baris (bukan hanya yang pertama). -print
untuk menemukan adalah kemudahan untuk menunjukkan file mana yang sedang dicocokkan. Semua ini bergantung pada versi yang tepat dari alat ini di sistem Anda.