regex 在makefile中使用bash正则表达式

o8x7eapl  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(144)

我有一个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中做的事情,或者如果没有,我错过了什么来让这种方法工作?

bt1cpqcv

bt1cpqcv1#

bash不支持\w。另外,+{3}没有多大意义,只使用{3}。此外,最后的.*是不需要的-regex不必匹配整个字符串。

[[ foo/foo-123 =~ ([[:alpha:]]+/)*([[:alpha:]]{3}-[0-9]+) ]] && echo ${BASH_REMATCH[2]}

在Makefile中,您需要将美元符号加倍:

SHELL = /bin/bash
test:
    [[ foo/foo-123 =~ ([[:alpha:]]+/)*([[:alpha:]]{3}-[0-9]+) ]] && echo $${BASH_REMATCH[2]}

相关问题