
Eu gostaria de trocar variáveis do arquivo antigo para o novo quando usar uma única linha como esta
cat ../oldFile.html | sed "s@$dayMaxInNew@$dayMaxIn@g" > newFile
Há resultado de newFile.
Mas quando uso mais de 2 linhas da seguinte forma:
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
nenhum resultado de newFile. Tento usar sleep, mas não funciona. PS. A 2ª e a 3ª linha eu troco a variável no mesmo arquivo. algum conselho?
Responder1
O redirecionamento elimina (limpa) o arquivo antes da execução do comando. O comando sponge
demaisutils, absorve sua entrada padrão antes de gravar em um arquivo. Dessa forma, o arquivo é sobrescrito após a execução do comando.
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
Se você não tiver moreutils, poderá usar arquivos temporários. Observe também que você não precisa usar 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
E, finalmente, você pode combinar vários comandos sed em um.
sed "s@$dayMaxInNew@$dayMaxIn@g
s@$dayAvgInNew@$dayAvgIn@g
s@$dayCurInNew@$dayCurIn@g" < ../oldFile.html > newFile
ou
sed -e "s@$dayMaxInNew@$dayMaxIn@g" \
-e "s@$dayAvgInNew@$dayAvgIn@g" \
-e "s@$dayCurInNew@$dayCurIn@g" < ../oldFile.html > newFile
Responder2
Nunca consuma dados de um arquivo para o qual você está redirecionando; o redirecionamento irá destruir o arquivo, geralmente antes que você tenha a chance de lê-lo. Use vários sed
comandos.
sed "command1;command2;command3" < ../oldfile.html > newFile