![sed 无法用 \ 字符替换字符串](https://linux22.com/image/210571/sed%20%E6%97%A0%E6%B3%95%E7%94%A8%20%5C%20%E5%AD%97%E7%AC%A6%E6%9B%BF%E6%8D%A2%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我正在尝试删除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 不认为值得转义。但考虑到这一点只会让这个混乱变得更加混乱。