$ echo 'output: " ' | sed "s/\"/\"/"
output: "
$ echo 'output: " ' | sed "s/\"/\\\"/"
output: "
$ echo 'output: " ' | sed "s/\"/\\\\\"/"
output: \"
我想了解第一个和第二个示例中发生的情况。我的理解是,因为我在表达式中使用双引号sed
,\"
所以被解释为"
并被\\
解释为\
。如果是这样那么为什么我的第二个输出是而"
不是\"
?
我知道我可以在sed
as's/"/\"/'
和 it中使用单引号不与 inteded 一样工作并替换"
为"
.
我真的很好奇为什么双引号会出现这种行为。
- GNU bash,版本 5.1.4(1)-发布 (x86_64-pc-linux-gnu)
- sed(GNU sed)4.8
答案1
在里面外壳规格:
2.2.3 双引号
用双引号 ( "" ) 括起来的字符应保留双引号内所有字符的字面值,但字符反引号、美元符号和反斜杠除外,如下所示:
(...)
仅当反斜杠后跟以下字符之一(被认为是特殊的)时,才应保留其作为转义字符的特殊含义:
$ ` " \ <newline>
所以,
案件 | 在 shell 之前(你所看到的) | shell 之后(Sed 得到的) |
---|---|---|
1 | "s/\"/\"/" |
s/"/"/ |
2 | "s/\"/\\\"/" |
s/"/\"/ |
3 | "s/\"/\\\\\"/" |
s/"/\\"/ |
在sed的规范,s
命令:
未指定未转义反斜杠后紧跟除“&”、反斜杠、数字、换行符或用于此命令的分隔符之外的任何字符的含义是未指定的。
因此,在情况 2 中,输出未指定(即,Sed 实现可以自由地按照自己的喜好解释此类情况)。GNU Sed 利用这种自由提供了几个特殊字符,其中包括\r
用于回车符的\n
换行符等(请参阅手册中的完整列表)。\"
不是其中之一,它选择简单地删除反斜杠。结果,情况 2 等同于 GNU Sed 中的情况 1。