Das Verhalten von >wird in dieser Antwort von Unix & Linux SE erläutert . Das Beispiel gibt es cat test.txt > test.txtund die Erklärung ist:
Das erste, was passiert, ist das Öffnen von bash
test.txt, wodurch die Datei abgeschnitten wird. Es ist jetzt leer, bevorcatmittest.txtals Argument ausgeführt wird.
Ihr sed '…' file.xml > file.xmllöst das gleiche Verhalten aus.
Ganz einfache Lösung mit einem einzigen sed:
sed -i 's/<active>true/<active>DUMMY/g s/<active>false/<active>true/g s/<active>DUMMY/<active>false/g' file.xml Die -iOption löst Ihr Problem mit der abgeschnittenen Datei. Der Befehl wechselt <active>truein <active>falseund umgekehrt. Beachten Sie, dass Sie nicht nur verwenden können
s/<active>true/<active>false/g;s/<active>false/<active>true/g weil der zweite Teil nicht erkennen kann, ob falsees sich um das Original falseoder um das Original handelt, das truegerade in umgewandelt wurde false. Dies führt dazu, dass jedes Matching trueoder falseEnding als true. Aus diesem Grund habe ich den temporären DUMMYErsatz verwendet. Vielleicht gibt es einen besseren Weg, ich weiß es noch nicht.
Die einzige Bedingung ist, dass die Zeichenfolge <active>DUMMYnicht in der Originaldatei angezeigt werden kann. Wenn es angezeigt wird, verwenden Sie einen anderen Dummy-String, der nicht sicher erscheint.