2012-03-22 66 views
2

我有一個字符串,「$ server ['fish_stick']」(忽略雙引號)搜索單引號grep字符串?

我不知道如何成功grep完全匹配此字符串。我嘗試了很多方法。

我試過,

rgrep -i \$'server'\[\''fish'\_'stick'\'\] . 

rgrep -i "\$server\[\'fish\_stick\'\]" . 

rgrep -i '\$server\[\'fish\_stick\'\]' . 

難道是造成我的問題單引號? 當我回應第一個grep時,它顯示了我想要搜索的內容,但返回垃圾結果,就像其中包含$ server的任何內容。

請幫忙解釋一下,謝謝!

回答

1

這裏的主要問題是你沒有引用傳遞給grep的參數。唯一需要轉義的是\ $(如果雙引號)和[]。如果你想完全匹配的字符串(不使用正則表達式),只是用fgrep一樣(的grep -F),這確實精確字符串匹配:

grep -F "\$server['fish_stick']" 

作品在我的系統上:

$ foo="\$server['fish_stick']" 
$ echo "$foo" | grep -F "\$server['fish_stick']" 
$server['fish_stick'] 

使用正則表達式:

$ echo "$foo" | grep "\$server\['fish_stick'\]" 
$server['fish_stick'] 

使用正則表達式和處理嵌套的單引號:

$ echo "$foo" | grep '\$server\['\''fish_stick'\''\]' 
$server['fish_stick'] 

在單引號內部,嵌套的單引號不能被轉義。您必須關閉引號,然後重新打開它以「轉義」單引號。

http://mywiki.wooledge.org/Quotes

0

我不認爲你問如何得到這個字符串到一個變量,而無需引用的問題。如果你是,這裏是一個使用此文檔的方式:

str=$(cat <<'END' 
$foo['bar'] 
END 
) 

解決您在轉義特殊字符grep的關注,你可以使用SED任何非字母數字字符前加一個反斜槓:

grep "$(sed 's/[^[:alnum:]]/\\&/g' <<< "$str")" ... 

當與set -x一起使用時,grep命令看起來像:grep '\$foo\[\'\''bar\'\''\]' ...