2010-03-03 145 views
29

我很好奇,爲什麼sed需要3 \只是爲了識別一個?我會理解它需要2,但我不知道。爲什麼sed需要3個反斜槓作爲常規反斜槓?

編輯:這裏是我的Windows計算機上的例子,使用Cygwin:

echo "sample_input\whatever" | sed "s/\\\/\//" 

如果我不加3個反斜槓,我得到一個

sed: -e expression #1, char 7: unterminated s' command 
+0

顯示你有什麼 – ghostdog74 2010-03-03 07:00:55

+0

它沒有。告訴我們你爲什麼這麼做。 – 2010-03-03 07:01:07

+0

是你的殼消耗額外的反斜槓水平? – p00ya 2010-03-03 07:07:23

回答

31

我能夠使用Vista和Cygwin 1.7.0重現此行爲。

  • 兩個反斜槓產生錯誤
  • 要麼或四個反斜槓工作
  • 五給出了同樣的錯誤

兩個反斜槓成爲殼一個反斜槓,然後在sed逃避中間分隔符的正斜槓。

\\/ -> \/ (which makes the forward slash a regular character instead of a delimiter) 

其中三個:前兩個成爲一個在其殼,然後逃逸在sed

第三個
\\\/ -> \\/ 

四:每對成爲殼單者然後將第一所得一個逃逸第二次在SED

\\\\/ -> \\/ 

編輯:

哦,我忘了說單引號和雙引號對我來說都是一樣的(cmd.exe並沒有做出Bash等人的區別)。

+0

但是,如果反斜槓後的字符不是斜線,'s/\\ [0-9] * //'似乎是正確的 – Timo 2018-01-16 13:58:52

4

請出示一下您的例子在未來。在sed,說你要替換「\」用管道(|),例如

$ cat file 
asklfja \ asf 

$ sed 's/\\/|/g' file 
asklfja | asf 

$ sed 's%\\%|%g' file #using different delimiter 
asklfja | asf 

你只需要一次逃脫它。

編輯:以@ OP爲例,由於您使用的是cmd.exe而不是bash/ksh,因此cmd.exe不喜歡單引號。我無法制作你的場景。這適用於我的GNU sed的使用2個窗口斜槓

C:\test>echo "sample_input\whatever" | sed "s/\\/\//" 
"sample_input/whatever" 
+1

@ ghostdog74,我發佈了一個例子。 – Geo 2010-03-03 07:07:40

+0

@geo,看我的編輯 – ghostdog74 2010-03-03 07:19:50

+0

我沒有使用bash,ghostdog74和單引號,我得到了同樣的錯誤。 – Geo 2010-03-03 07:26:37

0

我猜,你假設\\\n\\\t三個反斜槓那裏,但實際上,它的2個反斜線和另一個模式

backslash   \\ 
    newline   \n 
    tab    \t 

也,/可能需要逃脫,因爲在s/...//正在使用的開放和關閉部分。

所以/\\\/\//會根據您的更新例如

+0

我喜歡你的解釋方法,你可以看看這個並試着回答它嗎?https://superuser.com/questio ns/1249497/sed-needs-n-append-new-line?noredirect = 1#comment1834908_1249497 – 2017-09-12 19:42:23

8

你的外殼(可能的bash)在做自己的逸出\\ + \/ + \/,而這迷惑你。您可以使用echo命令來查看正在傳遞什麼,或者很容易編寫自定義程序(通常稱爲「showargs」或類似):

 
$ echo "s/\\\/\//" 
s/\\/\// 
$ echo "s/\\/\//" 
s/\/\// 

您還可以使用單引號,這是在區別對待慶典。

+0

我使用Windows的'cmd.exe',而不是bash。 – Geo 2010-03-03 07:26:05

+0

@Geo:我猜bash是因爲你提到了cygwin,但其他shell也是逃避了。 – 2010-03-03 07:29:35

1

在我的CYGWIN版本中,它的工作方式與原始海報相同,但如果使用單引號,則工作方式不同(通常)。

 
$ echo "sample_input\whatever" | sed 's/\\/\//' 
sample_input/whatever 
 
$ echo "sample_input\whatever" | sed "s/\\/\//" 
sed: -e expression #1, char 7: unterminated `s' command 

嗯..

0

更換一個反斜槓有兩個在我的Cygwin需要這個表達式:

SED -e 「S | \\ | \\\\ | G」

5

這是由於sh的雙引號字符串解析規則。

Posix指定sh解析雙引號字符串的方式。

反斜槓應保留其特殊含義的轉義字符後僅在由下列字符視爲特殊情況下(見轉義字符(反斜槓)): $`「\

在換句話說,sh將反斜線後面加上$'「以外的字符。

所以,如果sh符合雙引號字符串sed "s/\\\/\//",sh解析它如下。

  1. 前兩個\\改爲\。因爲第一個\之後是第二個\
  2. 第三個和第四個\仍然留在字符串中。因爲它們後面跟着/,這在雙引號字符串中並不特殊。

pasring後,sh經過串s/\\/\//sed,其取代的\第一次出現爲/

隨着相同的推理,當sh滿足串,"sed s/\\\\/\//"sh傳遞/\\/\//sed,這也代用品\第一次出現爲/