如何在正则表达式中转义以前未知的字符串?

时间:2011-03-16 17:10:28

标签: bash scripting grep

我需要egrep一个在运行时之前未知的字符串,并且我将通过shell变量获取(shell是bash,如果这很重要)。问题是,该字符串将包含大括号,空格,点,斜杠等特殊字符。

如果我知道字符串,我可以一次一个地转义特殊字符,但是如何为整个字符串执行此操作?

通过sed脚本运行字符串为每个特殊字符添加前缀可能是一个想法,我仍然需要rtfm应该如何编写这样的脚本。我不知道是否有其他更好的选择。

我确实读过re_format(7)但似乎没有像“将整个下一个字符串视为字面”这样的事情......

编辑:为了避免误报,我还应该为模式添加换行检测,例如。 egrep '^myunknownstring'

3 个答案:

答案 0 :(得分:7)

如果你需要将字符串嵌入到更大的表达式中,sed就是这样做的。

s_esc="$(echo "$s" | sed 's/[^-A-Za-z0-9_]/\\&/g')" # backslash special characters
inv_ent="$(egrep "^item [0-9]+ desc $s_esc loc .+$" inventory_list)"

答案 1 :(得分:4)

使用-F标志使PATTERN成为固定的文字字符串

$ var="(.*+[a-z]){3}"
$ echo 'foo bar (.*+[a-z]){3} baz' | grep -F "$var" -o
(.*+[a-z]){3}

答案 2 :(得分:0)

您是否尝试保护字符串不被错误地解释为bash语法,或者您是否试图保护字符串的某些部分不被解释为正则表达式语法?

对于bash保护:

grep支持-f开关:

-f FILE, --file=FILE
    Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.

文件中不需要转义。只需将其作为包含单行(以及一种模式)的文件,如果您需要这样做,可以从shell变量生成。

# example trivial regex
var='^r[^{]*$'
pattern=/tmp/pattern.$$
rm -f "$pattern"
echo "$var" > "$pattern"
egrep -f "$pattern" /etc/password
rm -f "$pattern"

只是为了说明这一点。

尝试使用-F作为另一张建议用于正则表达式保护的海报。