Почему это регулярное выражение для sed разрывается внутри Makefile? - PullRequest
3 голосов
/ 05 апреля 2010

Я использую 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". Однако, это работает, если я заменю \+ на \{1,\} в Makefile:

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/'

Есть ли какое-то особое значение для \+ в Makefiles, или это ошибка?

1 Ответ

2 голосов
/ 05 апреля 2010

\+ не имеет особого значения. Кроме того, я думаю, в 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 (по умолчанию /bin/sh, и ее можно изменить, как показано здесь ) и оболочка, в которую вы вводите команды (чтобы проверить, совпадают ли обе версии), и это каким-то образом влияет на то, что вы делаете. Например, в этих оболочках вызываются разные версии sed по умолчанию, и в одной из них \+ равно , а не эквивалентно \{1,\}.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...