在 shell 腳本中使用多個寫入檔案和 sed 時沒有結果

在 shell 腳本中使用多個寫入檔案和 sed 時沒有結果

當我使用這樣的單行時,我想將變數從舊文件交換到新文件

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 沒有結果。我嘗試使用睡眠,但它不起作用。附言。第二行和第三行我交換同一文件中的變數。有什麼建議嗎?

答案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 指令合併為一個。

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

相關內容