Atenção: este é um método perigoso! Abusa dos buffers de E / S no Linux e, com opções específicas de buffer, ele consegue trabalhar em arquivos pequenos. É uma curiosidade interessante.Mas não o use para uma situação real!
Além da -iopção de sed
você pode usar o teeutilitário .
De man:
tee - leia da entrada padrão e grave na saída e nos arquivos padrão
Portanto, a solução seria:
sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee | tee index.html
- aqui o teeé repetido para garantir que o pipeline seja armazenado em buffer. Todos os comandos no pipeline são bloqueados até obterem alguma entrada para trabalhar. Cada comando no pipeline inicia quando os comandos upstream gravam 1 buffer de bytes (o tamanho é definido em algum lugar ) na entrada do comando. Então o último comandotee index.html , que abre o arquivo para gravação e, portanto, o esvazia, é executado após a conclusão do pipeline upstream e da saída no buffer dentro do pipeline.
Provavelmente, o seguinte não funcionará:
sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee index.html
- ele executará os dois comandos do pipeline ao mesmo tempo sem nenhum bloqueio. (Sem bloquear o gasoduto deve passar a linha de bytes por linha em vez de tampão por tampão. O mesmo que quando você executar cat | sed s/bar/GGG/. Sem o bloqueio é mais interativo e geralmente pipelines de apenas 2 comandos executados sem buffer e bloqueando. Pipelines mais longos são tamponados.) A tee index.htmlvontade abra o arquivo para escrever e ele será esvaziado. No entanto, se você ativar o buffer sempre, a segunda versão também funcionará.
perl -pi -w -e 's/STRING_TO_REPLACE/REPLACE_WITH/g;' index.html