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, beforecatis executed withtest.txtas 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.