Para sed 's/cat/dog/'
ou qualquer outra substituição que não altere o tamanho do arquivo, com qualquer shell parecido com o Bourne, você pode fazer:
sed 's/cat/dog/' < file 1<> file
O pouco conhecido, mas com mais de 35 anos de idade¹ padrão <>
operator é para abrir um arquivo no modo de leitura + gravação sem truncamento . Basicamente, aqui isso faz com que sed
escreva sua saída sobre sua entrada. É importante garantir que a saída não sobrescreva as seções do arquivo que sed
ainda não leu.
Para substituições que diminuem o tamanho do arquivo, com ksh93
:
sed 's/hippopotamus/ant/' < file 1<>; file
<>;
, uma extensão ksh93
é igual a <>
, exceto que, se o comando que está sendo redirecionado for bem-sucedido, o arquivo será truncado quando o comando terminar.
Ou com o perl:
perl -pe 's/hippopotamus/ant/;
END{truncate STDOUT, tell STDOUT}' < file 1<> file
Para qualquer outra coisa, basta usar o formulário padrão:
cp -i file file.back &&
sed 's/dog/horse/g' < file.back > file # && rm -f file.back
¹ Embora a implementação inicial no shell Bourne e nas versões iniciais do shell Korn estivesse realmente quebrada, corrigida no final dos anos 80. E a concha de Almquist inicialmente não a apoiava.