REG=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/g
(echo "1.2.3" | grep -Eq "$REG" ) && echo "matched" || echo "did not match"
我收到错误:
test.sh: line 2: syntax error near unexpected token `('
test.sh: line 2: `REG=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/g'
在这里不是很多。试图查看1.2.3
是否符合正则表达式。
答案 0 :(得分:2)
使用引号使shell不会对特殊字符进行barf。
REG='/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/g'
请注意,此正则表达式不适用于grep。 POSIX正则表达式语法与Perl语法不同且更有限,这是您所拥有的。
答案 1 :(得分:0)
你遇到了两个主要问题
Bash在存储之前处理特殊字符,转义以及在字符串中找到的任何其他内容。这可以通过单引号来解决,以防止bash扩展/解释。
Regex是用Perl语法编写的,grep不支持,它使用的POSIX与Perl略有不同,即使两者相似。这可以通过移除周围的/
/g
并将\d
的所有[0-9]
实例替换为POSIX无法识别的REG='^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-(0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$'
来解决。
结果:
KeyValuePair<TKey,TValue>