Infelizmente, parece que sed
, com a opção -i
, sempre cria um arquivo temporário (ênfase minha):
-i[SUFFIX]
--in-place[=SUFFIX]
This option specifies that files are to be edited in-place. GNU 'sed' does this by creating a temporary file and sending output to this file rather than to the standard output.(1).
This option implies
-s
.When the end of the file is reached, the temporary file is renamed to the output file's original name. The extension, if supplied, is used to modify the name of the old file before renaming the temporary file, thereby making a backup copy(2)).
Isso significa que, mesmo que o conteúdo do arquivo não seja alterado por sed
, o arquivo original será recriado.
Uma solução alternativa seria usar um script que usa grep
para descobrir se o arquivo precisa da substituição antes de usar sed
.
Um exemplo simples:
for FILE in ~/mydir/**/*.txt
do
if grep -q PATTERN "$FILE"; then
sed -i 's/oldpat/newpat/g' "$FILE"
fi
done
A alteração de -q
para grep
é usada para impedir que a saída da linha correspondente corresponda a stdout
.