A opção -i
realmente não sobrescreve o arquivo original. Ele cria um novo arquivo com a saída e o renomeia para o nome do arquivo original. Como você não tem espaço no sistema de arquivos para esse novo arquivo, ele falha.
Você precisará fazer isso sozinho no seu script, mas crie o novo arquivo em um sistema de arquivos diferente.
Além disso, se você acabou de excluir as linhas que correspondem a um expressão regular, use grep
em vez de sed
.
grep -v 'myregex' /path/to/filename > /tmp/filename && mv /tmp/filename /path/to/filename
Em geral, raramente é possível que os programas usem o mesmo arquivo como entrada e saída - assim que começar a gravar no arquivo, a parte do programa que está lendo o arquivo não verá mais o conteúdo original. Portanto, ele precisa copiar o arquivo original em algum lugar primeiro ou gravar em um novo arquivo e renomeá-lo quando estiver pronto.
Se você não quiser usar um arquivo temporário, tente armazenar em cache o conteúdo do arquivo na memória:
file=$(< /path/to/filename)
echo "$file" | grep -v 'myregex' > /path/to/filename