次のようなシェルスクリプトがあります。
for fl in /home/dr/*.txt; do
mv $fl $fl.old
sed 's#$1#$2#g' $fl.old > $fl
rm -f $fl.old
done
のように実行しますが./script.sh find replace
、何も起こらず、出力もありません。どうしてこれなの?
これはうまくいくかもしれません(GNU sed):
sed -i "s#$1#$2#g" /home/dr*.txt
あなたが抱えていた問題は、sedコマンドを一重引用符で囲むと補間が許可されないことです。
問題は、二重引用符ではなく一重引用符を使用していることです。一重引用符でsed
、文字列を文字通りに解釈します(つまり、最初の引数ではなく、文字列を検索し$1
ます)。
以下は、あなたがやろうとしていたことの機能バージョンです。一時ファイルの使用をsedの「インプレース」編集に置き換えたことに注意してください。
for fl in /home/dr/*.txt
do
sed -i "s#$1#$2#g" $fl
done
ただし、すべてを1行にすることができます。
sed -i "s#$1#$2#g" /home/dr/*.txt