Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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在regexr.com中匹配,但不在GREP(bash)中匹配_Regex_Bash_Grep - Fatal编程技术网

Regex在regexr.com中匹配,但不在GREP(bash)中匹配

Regex在regexr.com中匹配,但不在GREP(bash)中匹配,regex,bash,grep,Regex,Bash,Grep,上面的正则表达式在regexr.com上适用于以下情况 /[SELECT]{6}[ ]{0,50}[@clnt_id_n]{10}[ \t]{0,50}[=]{1}[ \t]{0,50}[0-9]{2,10}/g 但是,当我将它与grep一起使用时,它似乎不起作用,如下所示: SELECT @clnt_id_n = 38404 [SELECT]{6}匹配“SELECT”,但也匹配“ELSLET”或6 C、E、L、S、T的任意组合。 要仅匹配“选择”,只需使用“选

上面的正则表达式在regexr.com上适用于以下情况

/[SELECT]{6}[ ]{0,50}[@clnt_id_n]{10}[ \t]{0,50}[=]{1}[ \t]{0,50}[0-9]{2,10}/g
但是,当我将它与grep一起使用时,它似乎不起作用,如下所示:

 SELECT @clnt_id_n               = 38404
[SELECT]{6}匹配“SELECT”,但也匹配“ELSLET”或6 C、E、L、S、T的任意组合。 要仅匹配“选择”,只需使用“选择”

匹配你所写的测试行考虑使用:

egrep "[SELECT]{6}[ ]{0,50}[@clnt_id_n]{10}[ \t]{0,50}[=]{1}[ \t]{0,50}[0-9]{2,10}" filename
“\s”匹配任何空格字符,如空格和制表符。 “+”表示1个或多个,而“*”表示0个或多个


请注意,上面的正则表达式假设“=”右侧的数字不能以0开头。

这是对@silel不错答案的补充。请注意,
grep-E
egrep
相同

grep -E "SELECT\s+@clnt_id_n\s*=\s*[1-9]+[0-9]*"

我将正则表达式锚定为整行(但允许到处都有空格)。如果这是不需要的,请从上面删除
^\s*
\s*$

egpre
grep
的扩展版本,它们不相似。您的正则表达式似乎很错误
[SELECT]{6}
只是说您需要S、E、L、C和T字母表中的6个字母,这些字母与SELECT匹配,但也与TECLES和Eeeee等匹配,这可能是您不想要的。@vdavid我只是在测试一些东西,在我的场景中,我将始终使用SELECT作为单词。我的其他正则表达式与egrep配合得很好,但我不知道为什么这不起作用。您应该注意,正则表达式在不同的工具/语言中是不一样的。。这是我从regexr.com上得到的:
regexr使用浏览器的RegExp引擎进行匹配,它的语法突出显示和文档反映了JavaScript RegExp标准。
egrep使用ERE,它没有非贪婪、lookarounds等。。。说到你的问题,你需要给出更多的输入行示例,解释并展示你的预期输出。。从正则表达式中很难理解您的意图。您尝试调整一个注释:OP不允许在
=
周围有空格。(他使用
{0,50}
)。因此,最好使用
\s*=\s*
而不是
\s+=\s+
@sille:做得很好,但是一个诡辩:
egrep
是(a)和(b)实际上只是
grep-E
的别名,因此
grep
标记是完全正确的。我建议从你的答案中删除评论,改用
grep-E
echo grep -E
grep -E '^\s*SELECT\s+@clnt_id_n\s*=\s*[0-9]+\s*$' <<EOF2
SELECT @clnt_id_n               = 38404
ELECTS @clnt_id_n               = 38404
 SELECT @clnt_id_n=38404  
XSELECT @clnt_id_n=38404
SELECT @clnt_id_n=xxx
EOF2

#If your `grep` knows the `-P` option, then you could shorten even more:

echo grep -P
grep -P '^\s*SELECT\s+@clnt_id_n\s*=\s*\d+\s*$' <<EOF
SELECT @clnt_id_n               = 38404
ELECTS @clnt_id_n               = 38404
 SELECT @clnt_id_n=38404  
XSELECT @clnt_id_n=38404
SELECT @clnt_id_n=xxx
EOF
grep -E
SELECT @clnt_id_n               = 38404
 SELECT @clnt_id_n=38404  
grep -P
SELECT @clnt_id_n               = 38404
 SELECT @clnt_id_n=38404