![如何使用 `sed` 来交换两个模式?](https://linux22.com/image/1566794/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20%60sed%60%20%E6%9D%A5%E4%BA%A4%E6%8D%A2%E4%B8%A4%E4%B8%AA%E6%A8%A1%E5%BC%8F%EF%BC%9F.png)
我正在使用命令在 xml 文件中sed
更改<active>true
为。现在如果我使用<active>false
sed 's/<active>true/<active>false/g' file.xml > file.xml
它完全删除了我的文件内容。使用>>
而不是 时>
,它会像预期的那样在末尾附加输出。
- 怎样才能实现我想要做的事?
- 为何
>
行为如此怪异? - 我实际上想要做的是将if存在 更改
<active>true
为if 存在,反之亦然。是否有一些命令可以做到这一点,还是我需要像我最初的计划那样编写一个脚本?<active>false
<active>true
<active>false
if-else
答案1
的行为>
解释为这个 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
不能出现在原始文件中。如果可能出现,请使用另一个肯定不会出现的虚拟字符串。