我需要egrep
一个在运行时之前未知的字符串,并且我将通过shell变量获取(shell是bash,如果这很重要)。问题是,该字符串将包含大括号,空格,点,斜杠等特殊字符。
如果我知道字符串,我可以一次一个地转义特殊字符,但是如何为整个字符串执行此操作?
通过sed脚本运行字符串为每个特殊字符添加前缀可能是一个想法,我仍然需要rtfm应该如何编写这样的脚本。我不知道是否有其他更好的选择。
我确实读过re_format(7)
但似乎没有像“将整个下一个字符串视为字面”这样的事情......
编辑:为了避免误报,我还应该为模式添加换行检测,例如。 egrep '^myunknownstring'
答案 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
作为另一张建议用于正则表达式保护的海报。