在 sed 表达式中转义反斜杠和双引号(用双引号括起来)

在 sed 表达式中转义反斜杠和双引号(用双引号括起来)
$ echo 'output: " ' | sed "s/\"/\"/"
output: "

$ echo 'output: " ' | sed "s/\"/\\\"/"
output: "

$ echo 'output: " ' | sed "s/\"/\\\\\"/"
output: \"

我想了解第一个和第二个示例中发生的情况。我的理解是,因为我在表达式中使用双引号sed\"所以被解释为"并被\\解释为\。如果是这样那么为什么我的第二个输出是而"不是\"

我知道我可以在sedas'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。

相关内容