No hay resultados al utilizar archivos de escritura múltiple y sed en el script de shell

No hay resultados al utilizar archivos de escritura múltiple y sed en el script de shell

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 spongedemá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 sedcomandos en su lugar.

sed "command1;command2;command3" < ../oldfile.html > newFile

información relacionada