Acabo de correr
cat /opt/webapplications/Word/readme.log | grep -v 'Apple'
y obtuve el resultado en el cli que esperaba, que era todas las líneas readme.log
que no contenían ' Apple
' ...
Luego corrí ...
cat /opt/webapplications/Word/readme.log | grep -v 'Apple' > /opt/webapplications/Word/readme.log
Sin embargo, /opt/webapplications/Word/readme.log
está en blanco.
¿Alguien puede explicarme por qué sucedió esto, o la forma correcta en que debería haberlo hecho?
Respuestas:
Esto sucedió porque lo primero que
>
hace es crear el archivo en el que desea escribir, y si el archivo ya existe, su contenido se eliminará. (Además, no es necesario utilizarlocat
en su estado de cuenta ya quegrep
funciona en archivos, no solo en STDIN).La forma correcta de hacerlo es utilizar un archivo temporal para leer o escribir. Entonces tampoco
o
trabajaría.
fuente
Al realizar la redirección al mismo archivo (
>
), el shell puede crear / truncar el archivo antes de quecat
se invoque el comando y se lea la entrada (consulte: ¿Por qué no funciona "ordenar archivo1> archivo1"? ). Si desea filtrar el archivo, es mejor redirigir la salida a un archivo diferente, o evitar la redirección, por ejemplo:La forma mejor y más segura es utilizar editores in situ diseñados para ese tipo de operaciones, p. Ej.
o usar
ex
(parte de Vim):Relacionado:
fuente