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

时间:2012-06-03 21:37:20

标签: c regex bash makefile

我有一堆按顺序命名的C源文件(比如f1.cf2.cf3.c等。

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

rm -f f1
rm -rf f1.dSYM
rm -f f2
rm -rf f2.dSYM
# etc

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

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

但是,如果我将该命令放在我的干净定义中,当我运行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

我想我的正则表达式中有一些特殊字符导致语法错误...我试过引用和转义的东西,但没有什么真的有帮助,有没有人知道我怎样才能在Makefile中使用它?

4 个答案:

答案 0 :(得分:5)

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

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

clean :
    rm -f $(SOURCES:.c=)
    rm -rf $(SOURCES:.c=.dSYM)

答案 1 :(得分:4)

ls | grep

ls无用的用法。 http://porkmail.org/era/unix/award.html#ls

rm -rf f[0-9] f[0-9]*[0-9] f[0-9]*.dSYM

清楚,使用 globing 。请参阅http://mywiki.wooledge.org/glob

答案 2 :(得分:1)

直接解决方案:引用你的正则表达式。更好的解决方案:整体,支撑扩展和/或find ... -delete

rm -rf f{1,2}{,.dSYM}
rm -rf f? f?.dSYM
ffind . -regex '.*/f[0-9]' -o -regex '.*/f[0-9].dSYM' -delete

答案 3 :(得分:0)

您的命令行shell可能与shell make使用的不同。我猜您在命令行使用/bin/bash,但默认情况下使用/bin/sh。您可以通过预先添加

来更改它
SHELL=/bin/bash

到Makefile。

在竖线和括号周围添加引号总是比不引用它们更安全。另请注意,美元符号必须在Makefile中加倍,才能被视为特殊字符。