O comportamento de >
é explicado em este Unix & Resposta do Linux SE . O exemplo lá é cat test.txt > test.txt
e a explicação é:
The first thing that happens is bash opens
test.txt
, which truncates the file. It is now empty, beforecat
is executed withtest.txt
as an argument.
Seu sed '…' file.xml > file.xml
aciona o mesmo comportamento.
Solução bastante simples com um único sed
:
sed -i 's/<active>true/<active>DUMMY/g
s/<active>false/<active>true/g
s/<active>DUMMY/<active>false/g' file.xml
A opção -i
resolve seu problema com o arquivo sendo truncado. O comando transforma <active>true
em <active>false
e vice-versa. Note que você não pode usar apenas
s/<active>true/<active>false/g;s/<active>false/<active>true/g
porque a segunda parte não sabe se false
é a% originalfalse
ou a true
original acabou de se transformar em false
. Isso faz com que todas as coincidências true
ou false
acabem como true
. Por esse motivo, usei a substituição temporária DUMMY
. Talvez exista uma maneira melhor de fazer isso, ainda não sei.
A única condição é que a string <active>DUMMY
não pode aparecer no arquivo original. Se aparecer, use outra string fictícia que não aparece com certeza.