Bash
在 sed 表達式中轉義反沖和雙引號(用雙引號括起來)
$ echo 'output: " ' | sed "s/\"/\"/" output: " $ echo 'output: " ' | sed "s/\"/\\\"/" output: " $ echo 'output: " ' | sed "s/\"/\\\\\"/" output: \"
我想了解第一個和第二個範例中發生了什麼。我的理解是,由於我對
sed
錶達式使用雙引號,因此\"
被解釋為"
並被\\
解釋為\
. 如果是這樣,那麼為什麼我的第二個輸出是"
而不是\"
?我知道我可以在
sed
as中使用單引號's/"/\"/'
,但它不能像 inteded 那樣工作,而是"
用"
.我真的很好奇為什麼雙引號會出現這種行為。
- GNU bash,版本 5.1.4(1)-release (x86_64-pc-linux-gnu)
- sed (GNU sed) 4.8
在外殼規範中:
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。