为什么我的正则表达式在Makefile中打破?

Ale*_*lan 1 c regex bash makefile

我有一大堆的顺序命名C源文件(比如说f1.c,f2.c,f3.c等).

在我的Makefile中,我有一个clean:过去看起来像这样的定义:

rm -f f1
rm -rf f1.dSYM
rm -f f2
rm -rf f2.dSYM
# etc
Run Code Online (Sandbox Code Playgroud)

所以我想用正则表达式替换它,如果我将它直接输入命令行,这个效果很好:

ls | grep -P ^f[0-9]+(|\.dSYM)$ | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

但是,如果我把那个命令放在我干净的定义中,当我运行时make clean,我得到这个:

$ make clean
ls | grep -P ^f[0-9]+(|\.dSYM)| xargs rm -rf
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `ls | grep -P ^ex[0-9]+(|\.dSYM)| xargs rm -rf'
make: *** [clean] Error 2
Run Code Online (Sandbox Code Playgroud)

我想有我正则表达式的一些特殊字符所导致语法错误......我已经试过引号和转义的东西,但什么也没有真正帮助,没有人知道我怎么能得到这个工作,我的Makefile里?

Chr*_*oph 5

另一种解决方案,$(wildcard)用于查找C源和模式替换以获取派生文件名:

SOURCES := $(wildcard f[0-9]*.c)

clean :
    rm -f $(SOURCES:.c=)
    rm -rf $(SOURCES:.c=.dSYM)
Run Code Online (Sandbox Code Playgroud)