O GNU sed aceita uma extensão opcional após -i
. A extensão deve estar no mesmo argumento sem espaço intermediário. Esta sintaxe também funciona no BSD sed.
sed -i.bak -e '…' SOMEFILE
Observe que no BSD, -i
também altera o comportamento quando há vários arquivos de entrada: eles são processados independentemente (por exemplo, $
corresponde à última linha de cada arquivo). Também isso não funcionará no BusyBox.
Se você não quiser usar arquivos de backup, verifique qual versão do sed está disponível.
case $(sed --help 2>&1) in
*GNU*) set sed -i;;
*) set sed -i '';;
esac
"$@" -e '…' "$file"
Ou, como alternativa, para evitar a supressão dos parâmetros posicionais, defina uma função.
case $(sed --help 2>&1) in
*GNU*) sed_i () { sed -i "$@"; };;
*) sed_i () { sed -i '' "$@"; };;
esac
sed_i -e '…' "$file"
Se você não quer se incomodar, use o Perl.
perl -i -pe '…' "$file"
Se você quiser escrever um script portátil, não use -i
- ele não está no POSIX. Faça manualmente o que o sed faz sob o capô - é apenas mais uma linha de código.
sed -e '…' "$file" >"$file.new"
mv -- "$file.new" "$file"