Regex 如何将正则表达式模式作为变量传递给grep?
例如,我有一个要匹配的正则表达式:Regex 如何将正则表达式模式作为变量传递给grep?,regex,shell,Regex,Shell,例如,我有一个要匹配的正则表达式:xx-xx-xxx:[a-z0-9]{2}-[a-z0-9]{2}-[a-z0-9]{3},我想将它存储到一个变量中,以便在程序中不断引用它。以下是我尝试过的: pattern="[a-z0-9]{2}-[a-z0-9]{2}-[a-z0-9]" grep -i "here:$pattern" file.log # assuming that my log file has "hi:xx-xx-xxx" pattern strings. 不返回任何结果,但如果
xx-xx-xxx
:[a-z0-9]{2}-[a-z0-9]{2}-[a-z0-9]{3}
,我想将它存储到一个变量中,以便在程序中不断引用它。以下是我尝试过的:
pattern="[a-z0-9]{2}-[a-z0-9]{2}-[a-z0-9]"
grep -i "here:$pattern" file.log # assuming that my log file has "hi:xx-xx-xxx" pattern strings.
不返回任何结果,但如果执行:
grep -i "here:[a-z0-9]{2}-[a-z0-9]{2}-[a-z0-9]" file.log
它起作用了。我做错了什么?您要么必须避开像so
\{2\}
这样的花括号,要么通过-E
标志使用grep的扩展regexp模式。
因此,两者都是
pattern='[a-z0-9]{2}-[a-z0-9]{2}-[a-z0-9]{3}'
echo "hi:aa-00-xxx" | grep -iE "hi:$pattern"
或
使用
set-x
在执行cmd时查看变量值的插值。将您在那里看到的内容与您的硬编码版本进行比较,然后根据需要转义字符,以获得相同的结果。祝你好运,谢谢!我在程序执行时看到变量。也许我应该打开一个新的线程。。。但它在这里似乎仍然非常相关:grep只引用了一个引号,尽管我在所有地方都使用了双引号。。有没有解决这个问题的建议?我应该提到的。单引号视图是shells显示“这是我所能合理化我所转换的内容”的方式。单引号字符串也将显示为单引号。而且(我认为)shell甚至会在没有引号(任何类型)的地方使用单引号字符串,只是为了明确“它正在处理什么”。只需使用set-x
视图编辑您的Q,并添加您对仍然不起作用的内容的评论。祝你好运。我在第一个案例中使用了egrep而不是grep-E,但结果仍然相同。有什么想法吗?我尽量避免逃过我的{},因为那会让人难以阅读。对于第一个案例来说,白鹭对我来说也很好。顺便说一句,在RHEL 6.7上测试它。我建议您对模式
变量使用单引号。另外,您使用的确切模式是什么?带或不带尾随的{3}
?“变量替换”仅在程序中使用时失败,还是在命令行中失败?您能否从命令行发布一个完整的transscript,其中显示错误,包括对包含模式的变量执行echo
?
pattern='[a-z0-9]\{2\}-[a-z0-9]\{2\}-[a-z0-9]\{3\}'
echo "hi:aa-00-xxx" | grep -i "hi:$pattern"