条件表达式中grep -E regex和Bash正则表达式之间的区别

时间:2018-03-30 08:45:15

标签: regex bash

对于应用于同一字符串的相同正则表达式,为什么grep -E匹配,但=~中的Bash [[ ]]运算符不匹配?

$ D=Dw4EWRwer
$ echo $D|grep -qE '^[A-Z][A-Za-z0-9]{1,2}[[:alnum:]_-\ ]{1,22}$' || echo wrong pattern
$ [[ "${D}" =~ ^[A-Z][A-Za-z0-9]{1,2}[[:alnum:]_-\ ]{1,22}$ ]] || echo wrong pattern
wrong pattern

更新:我确认这有效:

[[ "${D}" =~ ^[A-Z][A-Za-z0-9]{1,2}[[:alnum:]\ _-]{1,22}$ ]] || echo wrong pattern

1 个答案:

答案 0 :(得分:0)

问题(对于这两个版本的代码)都在这个字符类上:

awk '{ print $2/($3 * $4) }' file > newfile

[[:alnum:]_-\ ] 版本中,因为grep用单引号括起来,反斜杠不会转义任何内容,而regex收到的字符范围正是它在上面的表示方式。

grep版本中,反斜杠(bash)会转义其后面的空格,\用于测试的实际字符类为[[ ]]

因为在ASCII表中,下划线([[:alnum:]_- ])位于空格(_)和反斜杠()之后,所以这些字符类都不正确。

对于您可以使用的\版本:

bash

验证其结果。如果[[ "${D}" =~ ^[A-Z][A-Za-z0-9]{1,2}[[:alnum:]_-\ ]{1,22}$ ]]; echo $? 不正确,则退出代码为regex

如果你想将短划线(2)放入一个角色类,你必须把它作为课堂上的第一个角色(在-之后或[之后如果它是一个否定的类)或作为类中的最后一个字符([^]`)。

代码的right before the closing版本应该是(不需要转义用单引号括起来的字符串中的任何内容):

grep

代码的$ echo $D | grep -qE '^[A-Z][A-Za-z0-9]{1,2}[[:alnum:]_ -]{1,22}$' || echo wrong pattern 版本应为:

bash