Поведение >
объясняется в этом ответе Unix & Linux SE . Пример есть cat test.txt > test.txt
и объяснение:
Первое, что происходит, это открытие bash
test.txt
, которое усекает файл. Теперь он пуст, до того,cat
как выполняется сtest.txt
аргументом.
Вы sed '…' file.xml > file.xml
запускаете то же самое поведение.
Довольно простое решение с одним sed
:
sed -i 's/<active>true/<active>DUMMY/g s/<active>false/<active>true/g s/<active>DUMMY/<active>false/g' file.xml
-i
Вариант решает проблему с файлом усекается. Команда превращается <active>true
в <active>false
и наоборот. Обратите внимание, вы не можете использовать только
s/<active>true/<active>false/g;s/<active>false/<active>true/g
потому что вторая часть не может сказать, является ли какой-либо false
оригинал false
или оригинал true
только что превращенным false
. Это вызывает каждое совпадение true
или false
заканчивается как true
. По этой причине я использовал временную DUMMY
замену. Может быть, есть лучший способ сделать это, я пока не знаю.
Единственное условие - строка <active>DUMMY
не может появиться в исходном файле. Если это может появиться, используйте другую фиктивную строку, которая точно не появляется.