2017-10-18 130 views
0

問題:我有一個帶字符的變量我想在存儲在一個變量中的同一個字符串中添加另一個字符在sed中查找和替換變量中的特定字符

Ex。 「[blahblahblah]」 ---> 「\ [blahblahblah \]」

目前的解決方案:目前,我完成我想有兩個步驟,每一步攻擊一個支架

例。

temp=[blahblahblah] 
firstEscaped=$(echo $temp | sed s#'\['#'\\['#g) 
fullyEscaped=$(echo $firstEscaped | sed s#'\]'#'\\]'#g) 

這給我我想要的結果,但我覺得我可以在一行中使用capturing groups做到這一點。我只是沒有運氣,我正在被燒燬。我遇到的大多數例子都涉及到想要提取括號內的文本,而不是我想要做的。 This是我的最新嘗試無濟於事。有任何想法嗎?

回答

3

可能有更有效的方式,(僅1 s/s/r/與票友REG-EX),但是這個作品,給你的樣品輸入

fully=$(echo "$temp" | sed 's/\([[]\)/\\\1/;s/\([]]\)/\\\1/') ; echo "$fully" 

輸出

\[blahblahblah\] 

注意將多個sed操作鏈接在一起相當不錯,該操作由;分隔,或者如果在sed腳本文件中,則以空行分隔。

閱讀關於sed捕獲組使用\(...\)對,並引用它們的編號,即\1

IHTH

2
$ temp=[blahblahblah]  
$ fully=$(echo "$temp" |sed 's/\[\|\]/\\&/g'); echo "$fully" 
\[blahblahblah\] 

簡要說明,

  • \[\|\]:目標替代 '[' 或 ']',而對於 '[', ']' 和 '|'需要逃脫。
  • &:字符&指的是匹配的模式,並且介意它也需要被轉義。

由於@Gordon戴維森的建議,你也可以使用括號表達式,以避免擴展格式的正則表達式,

sed 's/[][]/\\&/g' 
+1

您需要雙擊報價'$ temp'防止分詞和通配符擴展。請注意,'[]'是一個shell通配符,所以它可能會意外擴展。 –

+0

是的,你是對的。這是從OP複製,並將修改此。 – CWLiu

+1

我也只是注意到你正在使用的正則表達式是擴展格式(使用'|'來分隔可選項)。除非使用'sed -r'(GNU sed)或'sed -E'(BSD sed),否則這通常不起作用。它可能會更好使用括號表達式(儘管包含括號的括號表達式很棘手)。 'sed's/[] []/\\&g''應該可以工作。 –