Una cosa a tener en cuenta sed
es que no puede escribir archivos por sí solo, ya que el único propósito de sed es actuar como editor en la "secuencia" (es decir, las tuberías de stdin, stdout, stderr y otros >&n
buffers, sockets y similares). Con esto en mente, puede usar otro comando tee
para volver a escribir la salida en el archivo. Otra opción es crear un parche para canalizar el contenido diff
.
Método de la camiseta
sed '/regex/' <file> | tee <file>
Método de parche
sed '/regex/' <file> | diff -p <file> /dev/stdin | patch
ACTUALIZAR:
Además, tenga en cuenta que el parche hará que el archivo cambie desde la línea 1 de la salida diff:
Patch no necesita saber a qué archivo acceder, ya que se encuentra en la primera línea de la salida de diff:
$ echo foobar | tee fubar
$ sed 's/oo/u/' fubar | diff -p fubar /dev/stdin
*** fubar 2014-03-15 18:06:09.000000000 -0500
--- /dev/stdin 2014-03-15 18:06:41.000000000 -0500
***************
*** 1 ****
! foobar
--- 1 ----
! fubar
$ sed 's/oo/u/' fubar | diff -p fubar /dev/stdin | patch
patching file fubar
-i
es una opción en gnu sed, pero no está en sed estándar. Sin embargo, transmite el contenido a un nuevo archivo y luego cambia el nombre del archivo para que no sea lo que desea.