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:
-i
argumen untuksed
perintah adalah ekstensi GNU, jadi, jika Anda menjalankan perintah ini dengansed
BSD Anda perlu mengalihkan output ke file baru lalu mengganti namanya.find
utilitas tidak mengimplementasikan-exec
argumen di kotak UNIX lama, jadi, Anda perlu menggunakan| xargs
sebagai 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.