Uma coisa a observar, sed
não é possível gravar arquivos por si só, pois o único objetivo do sed é atuar como um editor no "fluxo" (ou seja, pipelines de stdin, stdout, stderr e outros >&n
buffers, soquetes e similares). Com isso em mente, você pode usar outro comando tee
para gravar a saída de volta no arquivo. Outra opção é criar um patch para canalizar o conteúdo diff
.
Método Tee
sed '/regex/' <file> | tee <file>
Método de correção
sed '/regex/' <file> | diff -p <file> /dev/stdin | patch
ATUALIZAR:
Além disso, observe que o patch fará com que o arquivo mude da linha 1 da saída do diff:
O patch não precisa saber qual arquivo acessar, pois é encontrado na primeira linha da saída do 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
é uma opção no gnu sed, mas não está no sed padrão. No entanto, ele transmite o conteúdo para um novo arquivo e renomeia o arquivo para que não seja o que você deseja.