2017-02-19 110 views
1

我想請教一下sed的2個問題。差異sed命令的sed的///「和sed 」S ###「

例如,當我試圖把一個字符串sed中包含特殊字符像(。\ n * +)和sed無法正常運行。

set a = ".\n*.\+" 
set input = ".\n*.\+adsdfasdf" 

然後執行:

echo "$input" | sed 's/'$a'/hi/g' # It will give: sed: No match 

echo "$input" | sed "s#${a}#hi#g" # It will run but not true 

我的問題是:

  1. 這些命令之間的區別是什麼:sed中的///「和sed 「s ###」
  2. 如何看待輸入只是因爲它是純粹的字符串?
+0

在bash shell和GNU sed中都給出了'hi'作爲結果'a =「。\ n *。\ +」; 「\ N * \ + adsdfasdf」 輸入=;回聲「$輸入」| sed'/'$ a'/ hi/g'' ....參見https://stackoverflow.com/documentation/sed/1096/substitution#t=201702190808137883167關於使用不同分隔符的一些解釋.. – Sundeep

+0

afaik,沒有辦法告訴sed該字符串被視爲文字,你將不得不逃離元字符以及使用的分隔符 – Sundeep

回答

0

1.什麼是這些命令的區別是:用sed的///「和sed 」S ###「
---在你的情況,/#是的一個分離器關鍵的「節」:

小號命令(如替代)可能是在sed 最重要的,有很多不同的選擇。 s命令的語法是 「S /的regexp /更換/標誌」。
...
/字符可以被任何給定的s命令中的任何其他單個字符統一替換。


2.如何看待輸入只是因爲它是純粹的字符串?
---要展開/插值sed命令中的變量,這些變量或整個表達式應該雙引號括:

set a = ".\n*.\+" 
echo "$input" | sed "s/$a/hi/g" 
-1

最後,我發現分隔必須是與字符串中的任何字符不同! 或者它會導致錯誤!

因此,現在我將分離器更改爲#。這就像評論角色。

+0

已經看到,當sed分隔符設置爲/並且你的模式也是包含/你需要逃避它們。通過選擇不存在於模式中的不同分隔符(如|,#等),可以減少轉義。 –

+0

謝謝。我終於明白了。 – TuanLaDaPoet

+0

你好,歡迎來到Stack Overflow。請不要發表評論作爲答案 - 只有實際嘗試回答問題的內容應該使用「發佈答案」按鈕發佈。主持人可以將其轉換爲評論,但通常在此表示感謝的方式是單擊您喜歡的事物旁邊的向上箭頭,也可以選擇您最喜歡的答案旁邊的綠色複選標記。 – tripleee

0

那麼,你必須在輸入字符串,你不用引號分隔符代替在's/'$a'/hi/g'和被解析爲一個空間\n,所以你實際上2個參數傳遞給sed(1),你替換爲只有一個參數(與\n包括在如"s#$a#hi#g"一個字符)中只有一個參數(在這種雙引號包括可變取代)。在sed(1)中作爲分隔符使用的字符實際上沒有區別,但是您在兩次調用中調用了不同的名稱。