2016-03-13 68 views
0

我試圖在bash做以下命令:Sed則有錯誤,如果周圍的正則表達式沒有單引號

ls -1 | sed s/\(.*\)/"\1"/ 

這是周圍添加的ls每個輸出雙引號,但結果顯示 sed: 1: "s/(.*)/\1/": \1 not defined in the RE

我在正則表達式中添加單引號後,我得到了正確的結果。正確的是:

ls -1 | sed 's/\(.*\)/"\1"/'

theocratically我不需要右外引號?任何人都有相同的經歷?

+2

報價是不是有sed,是否有殼。 –

+0

@franky:或者'sed's /.*/"&"/'' – Cyrus

+0

@Cyrus這裏的意思是什麼? – franky

回答

2

單引號用於禁用各種序列的shell解析,包括反斜槓轉義。如果你不使用它們,你的序列如\(被傳遞給sed,如(。您可以通過將echo添加到您的命令開頭來檢查。

2

發送命令echo會告訴你的sed看到

$ echo sed s/\(.*\)/"\1"/ 
sed 

嗯,sed腳本完全消失。暴露的「*」迫使shell嘗試匹配文件。讓我們禁用:

$ set -f 
$ echo sed s/\(.*\)/"\1"/ 
sed s/(.*)/\1/ 

殼吃了引號和反斜線。引用sed腳本:

$ echo sed 's/\(.*\)/"\1"/' 
sed s/\(.*\)/"\1"/ 

這給出了正確的結果,sed會看到你想給它的腳本。我們怎樣才能做到這一點沒有報價

$ echo sed s/\\\(.\*\\\)/\"\\1\"/ 
sed s/\(.*\)/"\1"/ 

而這是醜陋的。