我正在尝试删除tech\file.php 中包含许多这样的行的所有字符串"tech\/what-is-vnet"。为什么这个命令什么也不做?
sed -i "s~tech\~~g" file.php
Run Code Online (Sandbox Code Playgroud)
sed将反斜杠视为转义字符,因此当它\~在命令字符串中看到时,它会将其解释为~已转义的含义,并且应将其视为匹配字符串的一部分而不是分隔符。为了防止这种情况,您需要使用另一个反斜杠转义反斜杠本身:
sed -i 's~tech\\~~g' file.php
Run Code Online (Sandbox Code Playgroud)
另请注意,我从使用双引号改为使用单引号。这是因为 shell(假设这里是类似 Bourne 的 shell)也将反斜杠视为转义符(除非它们在单引号中),所以如果它看到\\双引号字符串,它会将其解析为转义的反斜杠,并且只将第二个反斜杠传递给sed. 如果您想使用双引号,则需要在要传递给的每个sed反斜杠之前添加另一个反斜杠,总共 4 个反斜杠:
sed -i "s~tech\\\\~~g" file.php
Run Code Online (Sandbox Code Playgroud)
sed...这是建议对可能包含 shell 元字符的内容(如和模式)使用单引号的原因之一grep。
ps 强制相关xkcd:https://xkcd.com/1638/。
pps 实际上,三个反斜杠可以在双引号中使用,因为 shell 处理转义字符的方式有一个怪癖,例如~shell 认为不值得转义。但考虑到这一点只会让这个混乱变得更加混乱。