在 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

相关内容