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