我有一个makefile(它使用SHELL := /bin/bash
目标),我想解析一个字符串var来检索一个子字符串,我试图理解bash正则表达式语言的转义规则,但它不适合我。如果我将正则表达式存储在一个变量中,我可以在bash行中使用它,如下所示:
$ RE="(\w+\/)*(\w{3}-[0-9]+).*"
$ [[ "foo/foo-123" =~ $RE ]] && echo ${BASH_REMATCH[2]}
foo-123
$
但是,如果我尝试在命令本身中使用正则表达式,它将无法工作:
$ [[ "foo/foo-123" =~ (\w+\/)*(\w{3}-[0-9]+).* ]] && echo ${BASH_REMATCH[2]}
$
即使我把它用引号括起来,或者用途:
$ [[ "foo/foo-123" =~ ^(\w+\/)*(\w{3}-[0-9]+).*$ ]] && echo ${BASH_REMATCH[2]}
$
它不再匹配。如果我尝试在makefile中使用第一个解决方案,它也不能正确解析子字符串。我知道在makefile中使用$
会有更多的转义问题,但我很困惑为什么我在bash中遇到了这些问题,是否有更好的方法来实现我想在makefile中做的事情,或者如果没有,我错过了什么来让这种方法工作?
1条答案
按热度按时间bt1cpqcv1#
bash不支持
\w
。另外,+{3}
没有多大意义,只使用{3}
。此外,最后的.*
是不需要的-regex不必匹配整个字符串。在Makefile中,您需要将美元符号加倍: