2012-03-22 67 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\'\''\]' ...