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.