シェルスクリプトで複数の書き込みファイルとsedを使用しても結果はありません。

シェルスクリプトで複数の書き込みファイルとsedを使用しても結果はありません。

次のような1行を使用するときは、古いファイルの変数を新しいファイルに置き換えたいと思います。

cat ../oldFile.html | sed "s@$dayMaxInNew@$dayMaxIn@g" > newFile

newFileに結果があります。

ただし、次のように2つ以上の行を使用する場合:

cat ../oldFile.html | sed "s@$dayMaxInNew@$dayMaxIn@g" > newFile

cat newFile | sed "s@$dayAvgInNew@$dayAvgIn@g" > newFile

cat newFile | sed "s@$dayCurInNew@$dayCurIn@g" >  newFile

newFileに結果がありません。睡眠を試してみましたが、うまくいきません。 PS。 2行目と3行目では、同じファイルの変数を置き換えます。どんな提案がありますか?

ベストアンサー1

リダイレクトを実行すると、コマンドが実行される前にファイルが削除(クリーンアップ)されます。コマンドはsponge以下から来ます。その他のユーティリティ、ファイルを書き込む前にファイルの標準入力を吸収します。これにより、コマンドの実行後にファイルが上書きされます。

cat ../oldFile.html | sed "s@$dayMaxInNew@$dayMaxIn@g" > newFile
cat newFile | sed "s@$dayAvgInNew@$dayAvgIn@g" | sponge newFile
cat newFile | sed "s@$dayCurInNew@$dayCurIn@g" | sponge  newFile

moreutilsがない場合は、一時ファイルを使用できます。また、使用する必要はありませんcat

sed "s@$dayMaxInNew@$dayMaxIn@g" < ../oldFile.html > newFile
sed "s@$dayAvgInNew@$dayAvgIn@g" < newFile | sponge newFile
sed "s@$dayCurInNew@$dayCurIn@g" < newFile | sponge  newFile

最後に、複数のsedコマンドを1つにまとめることができます。

sed "s@$dayMaxInNew@$dayMaxIn@g
     s@$dayAvgInNew@$dayAvgIn@g
     s@$dayCurInNew@$dayCurIn@g" < ../oldFile.html > newFile

または

sed -e "s@$dayMaxInNew@$dayMaxIn@g" \
    -e "s@$dayAvgInNew@$dayAvgIn@g" \
    -e "s@$dayCurInNew@$dayCurIn@g" < ../oldFile.html > newFile

おすすめ記事