Regex在regexr.com中匹配,但不在GREP(bash)中匹配
上面的正则表达式在regexr.com上适用于以下情况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的任意组合。 要仅匹配“选择”,只需使用“选
/[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