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 -i
opção de sed
você pode usar o tee
utilitá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.html
vontade 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