Bash正则表达式组不起作用

use*_*382 6 regex bash shell scripting

我试图在我的bash脚本中模式匹配,但由于某种原因BASH_REMATCH var没有设置我的组.

代码如下:

if [[ "SYSENV01" =~ ^(SYS)(ENV)(01)$ ]]; then
    echo ${BASH_REMATCH[0]}        
    echo ${BASH_REMATCH[1]}
    echo ${BASH_REMATCH[2]}
fi
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这会打印出SYSENV01然后将2条空行打印到命令行 - 所以它必须匹配; 但是,小组没有出现.

有任何想法吗?这让我圈了很多年.

Don*_*van 1

我同意评论者的观点...这可能是本地 shell 问题。这是我在本地得到的:

\n\n

测试文件

\n\n
#!/bin/bash\nif [[ "SYSENV01" =~ ^(SYS)(ENV)(01)$ ]]; then\n    echo ${BASH_REMATCH[0]}        \n    echo ${BASH_REMATCH[1]}\n    echo ${BASH_REMATCH[2]}\nfi\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
~/tmp \xe2\x80\xba sh ./test.sh\nSYSENV01\nSYS\nENV\n
Run Code Online (Sandbox Code Playgroud)\n\n

Bash 版本信息:

\n\n
~/tmp \xe2\x80\xba bash --version\nGNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)\nCopyright (C) 2007 Free Software Foundation, Inc.\n
Run Code Online (Sandbox Code Playgroud)\n\n

效率不高,但使用以下命令可以实现相同的效果cut

\n\n
FIRST=$(echo "SYSENV01"  | cut -c1-3 )\nSECOND=$(echo "SYSENV01" | cut -c4-6 )\nTHIRD=$(echo "SYSENV01"  | cut -c7- )\n\necho $FIRST\necho $SECOND\necho $THIRD\n
Run Code Online (Sandbox Code Playgroud)\n\n

也许你可以用类似的东西代替?

\n