Đối với tính di động, tôi không dựa vào các tính năng của sed dành riêng cho linux hoặc BSD. Thay vào đó, tôi sử dụng overwrite
tập lệnh từ cuốn sách của Kernighan và Pike về Môi trường lập trình Unix.
Lệnh sau đó là
find /the/folder -type f -exec overwrite '{}' sed 's/old/new/g' {} ';'
Và overwrite
kịch bản (mà tôi sử dụng khắp nơi) là
#!/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 "$@" >$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
Ý tưởng là nó chỉ ghi đè lên một tệp nếu một lệnh thành công. Hữu ích ở những find
nơi bạn không muốn sử dụng
sed 's/old/new/g' file > file # THIS CODE DOES NOT WORK
bởi vì shell cắt ngắn tệp trước khi sed
có thể đọc nó.