Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何将正则表达式模式作为变量传递给grep?_Regex_Shell - Fatal编程技术网

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"