シェルスクリプトで複数の書き込みファイルと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

答え2

リダイレクトするファイルのデータを使用しないでください。通常、リダイレクトのためにファイルを読み取る機会が生じる前にファイルが破損します。代わりに複数のコマンドを試してくださいsed

sed "command1;command2;command3" < ../oldfile.html > newFile

関連情報