Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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 如何使用bash(3.2.25)和#x27;s是一个附加的二进制运算符:=~_Regex_Linux_Bash - Fatal编程技术网

Regex 如何使用bash(3.2.25)和#x27;s是一个附加的二进制运算符:=~

Regex 如何使用bash(3.2.25)和#x27;s是一个附加的二进制运算符:=~,regex,linux,bash,Regex,Linux,Bash,当我在rhel5.5上阅读bash(3.2.25)的信息时,我对如何使用“=~”感到困惑 # match the IP, and return true [kevin@server1 shell]# [[ 192.168.1.1 =~ "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" ]] && echo ok || echo fail ok 那么,我应该把字符串移到操作符的右边吗? 为什么第二个命令返回true,显然它应该

当我在rhel5.5上阅读bash(3.2.25)的信息时,我对如何使用“=~”感到困惑

# match the IP, and return true
[kevin@server1 shell]# [[ 192.168.1.1 =~ "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" ]] && echo ok || echo fail
ok

那么,我应该把字符串移到操作符的右边吗?
为什么第二个命令返回true,显然它应该返回false

以下是信息所说的:

另外还有一个二进制运算符,
=~”,具有相同的
优先级为
=”和!=”。当使用时,字符串将 运算符的右边被认为是一个扩展正则表达式 并相应地匹配(如regex3)。如果出现以下情况,则返回值为0 字符串与模式匹配,否则为1。如果定期 表达式在语法上不正确,条件 表达式的返回值为2。如果shell选项nocasematch' (请参见*注释Bash Builtins::)中的
shopt'说明)
启用时,执行匹配时不考虑以下情况:
字母字符。用括号匹配的子字符串
正则表达式中的子表达式保存在
数组变量
BASH\u REMATCH'。
BASH\u的元素与
索引0是字符串中与整个正则表达式匹配的部分
表情。索引为N的
BASH_REMATCH'元素是 字符串中与第n个括号中的子表达式匹配的部分


处理正则表达式模式的推荐的、最广泛兼容的方法是用单引号分别声明它们:

$ re='^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'
$ [[ 192.168.1.1 =~ $re ]] && echo ok || echo fail 
ok
$ [[ 192.168 =~ $re ]] && echo ok || echo fail 
fail

关于bash版本之间行为差异的一些讨论可以在上找到-take home消息是使用不带引号的变量是最好的方法。

与运算符本身无关,但是,正则表达式并没有将匹配的IP地址的每个字节限制在0-255之间。该正则表达式将接受IP,例如:999.999.999.999

请考虑使用以下内容:

^([01]?\d\d | 2[0-4]\d | 25[0-5])\{3}([01]?\d\d | 2[0-4]\d | 25[0-5]))$


这将在0.0.0.0和255.255.255.255之间匹配。我在java中使用的是regex,但我相信语法是相同的。如果没有,请告诉我

第一个示例仅适用于RHEL 5。这是一个在bash中修复的“bug”,但是RHEL出于向后兼容性的原因保留了它。在所有其他版本中,带引号的字符串被视为文本,而不是正则表达式。我无法在bash4.1中复制您的任何结果。@jordanm我知道在bash4.2中,qoute将字符串视为文字,unqoute将字符串视为正则表达式。但是为什么第二个命令返回true?我猜:如果没有引号,正则表达式在用作正则表达式之前会经历引号删除,这意味着句点不再被引用,正则表达式引擎将它们视为通配符。是的,它是!现在我知道为什么第二个命令返回true,因为shell将正则表达式重新解析为^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$,所以它意味着“0-9个数字,任何字符,任何字符,0-9个数字,任何字符,0-9个数字”,并且匹配192.168您是对的!但为什么第二个命令返回正确?你能举个例子吗?它是“BUG”吗?@lxf1992521第二个只有2个八位字节,但正则表达式需要4个八位字节,因此它不匹配,因此fails@Eric哦,对不起。第二个例子是我的问题的第二个例子。但在我的问题的第二个例子中,它返回真的!可能是因为您没有将正则表达式作为字符串,因此正则表达式不被视为文本,所以您可能会得到一个返回true的parcial匹配。也许吧?@lxf1992521我恐怕无法回答你的问题,为什么在你的bash版本中它会这样。我所能建议的就是你使用我提到的方法,这应该是预期的效果。谢谢,你的例子很完美!但我想知道的是为什么第二个命令会返回?
$ re='^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'
$ [[ 192.168.1.1 =~ $re ]] && echo ok || echo fail 
ok
$ [[ 192.168 =~ $re ]] && echo ok || echo fail 
fail