创建文件
[root@master-1 ~]# cat path.service C:\\Program Files\\MyApp \ qwe \\ qq \\ az
需求:使用sed将 \\ 替换为 \
执行sed命令,并使用双引号" "
[root@master-1 ~]# sed -i "s/\\\\/\\/g" path.service sed:-e 表达式 #1,字符 8:未终止的“s”命令
执行sed命令,并使用双引号 ' '
[root@master-1 ~]# sed -i 's/\\\\/\\/g' path.service
为什么在上面的命令中,单引号执行成功了,而双引号则失败?
问题解析:
这个问题的核心在于 双引号 ("
) 和 单引号 ('
) 在 sed
和 shell 中的解析方式不同。
差异分析:
-
单引号 (
'
)- 单引号会将引号内的内容视为一个完整的字符串,原样传递给
sed
,不会对其中的字符进行额外的解释或转义。 - 示例
-
sed -i 's/\\\\/\\/g' path.service
传递给
sed
的字符串是:
-
- 单引号会将引号内的内容视为一个完整的字符串,原样传递给
双引号 ("
)
- 双引号会让 shell 先解析引号中的内容,然后再将解析后的结果传递给
sed
。 - 在你的命令中:
sed -i "s/\\\\/\\/g" path.service
shell 会对双反斜杠 \\
进行一次转义,结果是 s/\\/\/g
,传递给 sed
后不符合预期的替换格式,因此失败。
具体区别的行为:
- 单引号保留了
\\\\
和\\/
的原始形式,sed
能正确解析它们为匹配\\
并替换为\
。 - 双引号导致 shell 提前处理反斜杠,破坏了原本的
sed
替换规则。