为什么sed的这个正则表达式在Makefile中断?

时间:2010-04-05 17:17:06

标签: regex makefile sed

我正在使用GNU Make 3.81,我的Makefile中有以下规则:

jslint :
    java org.mozilla.javascript.tools.shell.Main jslint.js mango.js \
    | sed 's/Lint at line \([0-9]\+\) character \([0-9]\+\)/mango.js:\1:\2/'

如果我直接在命令行输入它,这可以正常工作,但如果我用“make jslint”运行它,则正则表达式不匹配。但是,如果我在Makefile中用\+替换\{1,\}

jslint :
    java org.mozilla.javascript.tools.shell.Main jslint.js mango.js \
    | sed 's/Lint at line \([0-9]\{1,\}\) character \([0-9]\{1,\}\)/mango.js:\1:\2/'

Makefile中的\+是否有一些特殊含义,或者这是一个错误?

1 个答案:

答案 0 :(得分:2)

\+没有任何特殊含义。另外,我想,GNU Make没有任何问题。

即使在第一种情况下,表达式可能 匹配,但事情可能是

  • 当当前目录中已存在文件 make jslnit时,请致电jslint。在这种情况下,它不会被视为目标,应该调用适当的命令。可以肯定的是,尝试在命令中插入echo语句,只是为了告诉Make必须执行它们:

    jslint :
        echo I got here
        java org.mozilla.javascript.tools.shell.Main jslint.js mango.js \
        | sed 's/Lint at line \([0-9]\+\) character \([0-9]\+\)/mango.js:\1:\2/'
    
  • 您对java的调用会产生不同的结果(可能会发生变化?)

  • (这是问题,请参阅下面的评论) Make使用的shell(默认情况下为/bin/sh,并且可以如图所示进行更改{ {3}})和你输入命令的shell(检查两个版本是否匹配)不同,它会以某种方式影响你正在做的事情。例如,在这些shell中调用了不同的sed默认版本,其中一个\+ 等同于\{1,\}