Tidak ada cara untuk melakukannya hanya dengan menggunakan sed. Anda harus menggunakan setidaknya utilitas find secara bersamaan:
find . -type f -exec sed -i.bak "s/foo/bar/g" {} \;
Perintah ini akan membuat .bak file untuk setiap file yang diubah.
Catatan:
-iargumen untuksedperintah adalah ekstensi GNU, jadi, jika Anda menjalankan perintah ini dengansedBSD Anda perlu mengalihkan output ke file baru lalu mengganti namanya.findutilitas tidak mengimplementasikan-execargumen di kotak UNIX lama, jadi, Anda perlu menggunakan| xargssebagai gantinya.
Saya lebih suka menggunakan find | xargs cmd lebih dari find -exec karena lebih mudah diingat.
Contoh ini secara global menggantikan "foo" dengan "bar" dalam file .txt pada atau di bawah direktori Anda saat ini:
find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/foo/bar/g"
-print0 dan -0 opsi dapat diabaikan jika nama file Anda tidak mengandung karakter funky seperti spasi.
Untuk portabilitas, saya tidak mengandalkan fitur sed yang khusus untuk linux atau BSD. Sebaliknya saya menggunakan overwrite skrip dari buku Kernighan dan Pike tentang Lingkungan Pemrograman Unix.
Perintahnya kemudian
find /the/folder -type f -exec overwrite '{}' sed 's/old/new/g' {} ';'
Dan overwrite skrip (yang saya gunakan di semua tempat) adalah
#!/bin/sh
# overwrite: copy standard input to output after EOF
# (final version)
# set -x
case $# in
0|1) echo 'Usage: overwrite file cmd [args]' 1>&2; exit 2
esac
file=$1; shift
new=/tmp/$$.new; old=/tmp/$$.old
trap 'rm -f $new; exit 1' 1 2 15 # clean up files
if "[email protected]" >$new # collect input
then
cp $file $old # save original file
trap 'trap "" 1 2 15; cp $old $file # ignore signals
rm -f $new $old; exit 1' 1 2 15 # during restore
cp $new $file
else
echo "overwrite: $1 failed, $file unchanged" 1>&2
exit 1
fi
rm -f $new $old
Idenya adalah menimpa file hanya jika perintah berhasil. Berguna di find dan juga di mana Anda tidak ingin menggunakan
sed 's/old/new/g' file > file # THIS CODE DOES NOT WORK
karena shell memotong file sebelum sed bisa membacanya.