sed -i
na verdade não edita o arquivo "in-place", nunca; ele funciona redirecionando sua saída para um arquivo temporário e renomeando / movendo o arquivo temporário para o original.
Isso garante que o arquivo original não seja perdido no caso de algo dar errado no meio do caminho.
Para piorar, sed
(como vim
) tenta criar o arquivo temporário no mesmo diretório que o original.
O sistema de arquivos /proc
é sintético , você não pode simplesmente criar ou mover arquivos dentro dele; é por isso que você está recebendo esse erro. Mas mesmo que sed
estivesse criando o arquivo temporário em /tmp
, a última operação (a renomeação do arquivo temporário para o original) ainda falharia.
Você pode tentar fazer o que o sed -i
faz de uma maneira circular:
$ ised(){ for a; do :; done; t='mktemp' && sed "$@" > "$t" && cat "$t" > "$a" && rm "$t"; }
$ ised s/cd/II/g /proc/$$/fd/88
O nome do arquivo sempre deve ser o último argumento para ised
.
Isso quebra a garantia de consistência de sed -i
; a operação cat in > out
, ao contrário de mv in out
, não é atômica; se parado no meio, o arquivo out
será truncado.