2

次のようなシェルスクリプトがあります。

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、何も起こらず、出力もありません。どうしてこれなの?

4

2 に答える 2

3

これはうまくいくかもしれません(GNU sed):

sed -i "s#$1#$2#g" /home/dr*.txt

あなたが抱えていた問題は、sedコマンドを一重引用符で囲むと補間が許可されないことです。

于 2012-08-07T10:07:30.023 に答える
2

問題は、二重引用符ではなく一重引用符を使用していることです。一重引用符で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
于 2012-08-07T09:32:05.690 に答える