grep和regex存储在字符串中

grep和regex存储在字符串中,regex,bash,grep,Regex,Bash,Grep,我的问题很简短: a="'[0-9]*'" grep -E '[0-9]*' #for example, line containing 000 will be recognized and printed 但是 对grep regex的替换是否会改变命令的行为,或者从语法角度看我是否遗漏了什么?换句话说,如何使grep从存储在变量中的字符串中接受regex 提前感谢。引用的是数据,而不是数据。这意味着,在变量中存储数据(在本例中为正则表达式)时,不要在变量中嵌入引号;相反,在使用变量时,在其

我的问题很简短:

a="'[0-9]*'"
grep -E '[0-9]*' #for example, line containing 000 will be recognized and printed
但是

对grep regex的替换是否会改变命令的行为,或者从语法角度看我是否遗漏了什么?换句话说,如何使grep从存储在变量中的字符串中接受regex

提前感谢。

引用的是数据,而不是数据。这意味着,在变量中存储数据(在本例中为正则表达式)时,不要在变量中嵌入引号;相反,在使用变量时,在其周围加上双引号:

a="[0-9]*"
grep -E "$a"
在使用变量时,有时可以不使用双引号(如Avinash Raj的评论),但这通常并不安全。在这种情况下,如果当前工作目录中没有名称恰好以数字开头的文件或子目录,则它可以正常工作。您可以看到,如果在
$a
周围没有双引号,shell将获取其值,尝试将其拆分为多个单词(这里没有问题),尝试将包含shell通配符的每个单词扩展为匹配文件列表(这里可能有问题),并将其作为参数列表传递给命令(
grep
)。这意味着,如果当前目录中碰巧有以数字开头的文件,
grep
认为您运行了如下命令:

grep -E 1file.txt 2file.jpg 3file.etc
。。。它将第一个文件名视为要搜索的模式,将任何其他文件名视为要搜索的文件。你会抓挠你的头想知道为什么你的脚本工作或失败取决于你恰好在哪个目录


注意:模式
[0-9]*
是一个有效的正则表达式,也是一个有效的shell glob(通配符)模式,但在这两种上下文中的含义截然不同。作为正则表达式,它表示一行中有0个或多个数字。作为一个shell glob,它意味着以数字开头的东西。说到这里,
grep-E'[0-9]*'
实际上并不是很有用,因为所有内容都包含0或更多数字的字符串,所以它将匹配您提供给它的每个文件的每一行。

@AvinashRaj解决了它,谢谢。还有一个问题——如果我想附加存储在VarA中的正则表达式(比如用后缀|$);然后使用grep,我必须编写grep-E“$a |$”。但是,使用“”意味着f.e.\将从原始正则表达式中删除。有没有办法在不使用双引号的情况下附加它?
grep -E 1file.txt 2file.jpg 3file.etc