sed だけを使用してそれを行う方法はありません。少なくとも find ユーティリティを一緒に使用する必要があります:
find . -type f -exec sed -i.bak "s/foo/bar/g" {} \;
このコマンドは .bak
を作成します 変更された各ファイルのファイル。
注:
-i
sed
の引数 コマンドは GNU 拡張であるため、このコマンドを BSD のsed
で実行している場合 出力を新しいファイルにリダイレクトしてから、名前を変更する必要があります。find
ユーティリティは-exec
を実装していません 古い UNIX ボックスの引数なので、| xargs
を使用する必要があります
find | xargs cmd
を使用したい find -exec
以上 覚えやすいからです。
この例では、現在のディレクトリ以下の .txt ファイルで「foo」を「bar」にグローバルに置き換えます。
find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/foo/bar/g"
-print0
および -0
ファイル名にスペースなどの奇妙な文字が含まれていない場合は、オプションを省略できます。
移植性のために、Linux や BSD に固有の sed の機能には依存していません。代わりに overwrite
を使用します Unix プログラミング環境に関する Kernighan と Pike の本からのスクリプト。
コマンドは
find /the/folder -type f -exec overwrite '{}' sed 's/old/new/g' {} ';'
そして overwrite
スクリプト (私はあちこちで使用しています) は
#!/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
これは、コマンドが成功した場合にのみファイルを上書きするという考え方です。 find
で便利 また、使用したくない場所
sed 's/old/new/g' file > file # THIS CODE DOES NOT WORK
シェルは sed
の前にファイルを切り捨てるため 読めます。