次のような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