sed 无法用 \ 字符替换字符串

sed 无法用 \ 字符替换字符串

我正在尝试删除tech\file.php 中包含许多这样的行的所有字符串"tech\/what-is-vnet"。为什么这个命令什么也不做?

sed -i "s~tech\~~g" file.php

答案1

sed将反斜杠视为转义字符,因此当它\~在命令字符串中看到时,它会将其解释为~已转义的含义,并且应将其视为匹配字符串的一部分而不是分隔符。为了防止这种情况,您需要转义反斜杠本身,使用其他反斜杠:

sed -i 's~tech\\~~g' file.php

另请注意,我从使用双引号改为使用单引号。那是因为 shell(假设这里是类似 Bourne 的 shell)将反斜杠视为转义符 (除了当它们在单引号中时),因此如果它看到\\双引号字符串,它会将其解析为转义的反斜杠,并且只传递第二个反斜杠sed。如果你想使用双引号,你需要在前面添加另一个反斜杠每个您想要传递给 的反斜杠的数量sed,总共 4 个反斜杠:

sed -i "s~tech\\\\~~g" file.php

...这是建议对可能包含 shell 元字符的内容(如sed和模式)使用单引号的原因之一。grep

ps强制相关xkcd:https://xkcd.com/1638/

pps 实际上是三个反斜杠使用双引号工作,因为 shell 处理转义字符的方式有一个怪癖,例如~shell 不认为值得转义。但考虑到这一点只会让这个混乱变得更加混乱。

相关内容