
Me gustaría intercambiar variables de un archivo antiguo a un archivo nuevo cuando uso una sola línea como esta
cat ../oldFile.html | sed "s@$dayMaxInNew@$dayMaxIn@g" > newFile
Hay resultados de newFile.
Pero cuando uso más de 2 líneas de la siguiente manera:
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
no hay resultados de newFile. Intento dormir pero no funciona. PD. La segunda y tercera línea intercambio la variable en el mismo archivo. ¿algún consejo?
Respuesta1
La redirección bloquea (borra) el archivo antes de que se ejecute el comando. El comando sponge
demásutils, absorbe su entrada estándar antes de escribir en un archivo. De esa manera, el archivo se sobrescribe después de ejecutar el 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
Si no tiene más utilidades, puede utilizar archivos temporales. También tenga en cuenta que no es necesario utilizar 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
Y finalmente, puedes combinar varios comandos sed en uno.
sed "s@$dayMaxInNew@$dayMaxIn@g
s@$dayAvgInNew@$dayAvgIn@g
s@$dayCurInNew@$dayCurIn@g" < ../oldFile.html > newFile
o
sed -e "s@$dayMaxInNew@$dayMaxIn@g" \
-e "s@$dayAvgInNew@$dayAvgIn@g" \
-e "s@$dayCurInNew@$dayCurIn@g" < ../oldFile.html > newFile
Respuesta2
Nunca consumas datos de un archivo al que estás redirigiendo; la redirección bloqueará el archivo, generalmente antes de que hayas tenido la oportunidad de leerlo. Utilice varios sed
comandos en su lugar.
sed "command1;command2;command3" < ../oldfile.html > newFile