对于应用于同一字符串的相同正则表达式,为什么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
答案 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