Esta dica vem do site de notícias Dicas-L, mas como foi algo novo e interessante, resolvi colocar aqui para memória posterior (do tipo ah? onde tinha a dica de como editar arquivos com o sed sem se incomodar com arquivos temporários? me esqueci! ah! mas escrevi sobre isto no meu blog! pois afinal de contas, um dia eu ainda iria precisar disto!)
Então o truque consiste em abrir uma sub-shell que irá abrir o arquivo em questão num processo separado, e esta sub-shell poderá escrever diretamente no arquivo original, pois os dados originais passarão pela memória da sub-shel, não sendo perdidos:
echo "$(sed 's/nao/sim/' teste.txt)" > teste.txt
No site original se destacou a importância de usar as aspas duplas na sub-shell se não a shell tira os espaços duplos e quebras de linha, substituindo-os por espaços simples. Neste caso (com aspas duplas) o arquivo teste.txt é editado fielmente, isto é, como se você abrisse o arquivo com o editor vim, aplicasse o comando de substituição dando o comando “:%s/nao/sim” e fechasse o arquivo com o comando “:wq”. Em tese, com o sed dá pra fazer o mesmo trabalho em menos tempo. E atualmente, com as máquinas de vários megabytes ou até mesmo alguns gigabytes de memória RAM, não faz mal copiar o arquivo original para a memória através da sub-shell, para posterior gravação no disco rígido (o vim faria a mesma coisa, ou usaria o arquivo temporário .teste.txt.swp).
Observação: para fazer várias alterações com apenas um comando usar opções “-e” do sed antes de cada comando:
sed -e 's/<//g' -e 's/>//g' test2.html
A letra g depois de cada comando de substituição serve para aplicar a substituição em todas as ocorrências dentro de uma linha. Sem este modificador, apenas a primeira ocorrência de cada linha é modificada.
Então, para modificar o arquivo test2.html, com o comando sed anterior (e testar pra ver se a dica funciona) aplicamos:
echo "$(sed -e 's/<//g' -e 's/>//g' test2.html)">test2.html
Funciona!