Bash

在 sed 表達式中轉義反沖和雙引號(用雙引號括起來)

  • January 6, 2021
$ echo 'output: " ' | sed "s/\"/\"/"
output: "

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

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

我想了解第一個和第二個範例中發生了什麼。我的理解是,由於我對sed錶達式使用雙引號,因此\"被解釋為"並被\\解釋為\. 如果是這樣,那麼為什麼我的第二個輸出是"而不是\"

我知道我可以在sedas中使用單引號'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。

引用自:https://unix.stackexchange.com/questions/627824