Керниган и Пайк в Искусство программирования Unix обсуждают эту проблему. Их решение - написать скрипт под названием overwrite
, который позволяет делать такие вещи.
Использование: overwrite
file
cmd
file
.
# overwrite: copy standard input to output after EOF
opath=$PATH
PATH=/bin:/usr/bin
case $# in
0|1) echo 'Usage: overwrite file cmd [args]' 1>&2; exit 2
esac
file=$1; shift
new=/tmp/overwr1.$$; old=/tmp/overwr2.$$
trap 'rm -f $new $old; exit 1' 1 2 15 # clean up
if PATH=$opath "$@" >$new
then
cp $file $old # save original
trap '' 1 2 15 # wr are commmitted
cp $new $file
else
echo "overwrite: $1 failed, $file unchanged" 1>&2
exit 1
fi
rm -f $new $old
Как только у вас есть вышеуказанный скрипт в вашем $PATH
, вы можете сделать:
overwrite manipulate sed 's/cat/dog/' manipulate
Чтобы сделать вашу жизнь проще, вы можете использовать replace
скрипт из той же книги:
# replace: replace str1 in files with str2 in place
PATH=/bin:/usr/bin
case $# in
0|2) echo 'Usage: replace str1 str2 files' 1>&2; exit 1
esac
left="$1"; right="$2"; shift; shift
for i
do
overwrite $i sed "s@$left@$right@g" $i
done
Наличие replace
в вашем $PATH
также позволит вам сказать:
replace cat dog manipulate