我有一个字符串,“$ server ['fish_stick']”(忽略双引号)
我不知道如何成功地为此字符串成功匹配grep。我尝试了很多方法。
我试过了,
rgrep -i \$'server'\[\''fish'\_'stick'\'\] .
rgrep -i "\$server\[\'fish\_stick\'\]" .
rgrep -i '\$server\[\'fish\_stick\'\]' .
单引号会导致我的问题吗? 当我回复第一个grep时,它显示我想要搜索的内容,但返回垃圾结果,就像任何带有$ server的内容一样。
请帮忙解释一下,谢谢!
答案 0 :(得分: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']
在单引号内部,嵌套的单引号不能被转义。您必须关闭引号,然后重新打开它以“转义”单引号。
答案 1 :(得分:0)
我不认为你问的是如何在没有引用问题的情况下将字符串转换为变量。如果你是,这是使用here-document的方法:
str=$(cat <<'END'
$foo['bar']
END
)
要解决您对转义grep特殊字符的担忧,可以使用sed在任何非字母数字字符前加上反斜杠:
grep "$(sed 's/[^[:alnum:]]/\\&/g' <<< "$str")" ...
与set -x
一起使用时,grep命令如下所示:grep '\$foo\[\'\''bar\'\''\]' ...