Makefile中的管道

时间:2017-10-01 06:53:34

标签: sed makefile

以下sed在basho中完美运行:

pkexec /opt/texbin/tlmgr install $(cat source/*.md | sed -n 's~^[^%]*\\usepackage[^{]*{\([^}]*\)}.*$~\1~p' | paste -sd ' ' -)

然而,当我将它添加到制作目标时:

$(shell pkexec /opt/texbin/tlmgr install $(cat source/*.md | sed -n 's~^[^%]*\\usepackage[^{]*{\([^}]*\)}.*$~\1~p' | paste -sd ' ' -))

我收到错误:

/bin/sh: 1: Syntax error: Unterminated quoted string
  • 如何在Makefile中使用sed的正确方法?

1 个答案:

答案 0 :(得分:1)

我认为错误实际上是如何使扩展$变量引用和函数调用的副作用。您的示例有两个问题:

  • 你写$(cat …),但是make会扩展这个(什么都没有),类似于它展开($shell …)的方式。您需要编写$$(cat …),以便将美元符号传递给shell。
  • 正则表达式中的)被视为make函数调用的终结符(cat,因为它已写入,但它可能是shell)。

要修复第二个问题,请将正则表达式放入make变量,将$加倍:

regexp = s~^[^%]*\\usepackage[^{]*{\([^}]*\)}.*$$~\1~p

从sed命令引用它:

$(shell pkexec /opt/texbin/tlmgr install $$(cat source/*.md | sed -n '$(regexp)' | paste -sd ' ' -))

现在)对make函数调用解析器是隐藏的,不再混淆它。 '…'仍然是必要的,以防止正则表达式的shell扩展。