如何在makefile的shell命令中使用管道?

23

我在Makefile中有以下代码片段,除非我删除下面对sed和grep的引用,否则它总是失败。

TAB=$(shell printf "\t")
all: abstract.tsv
      $(shell cut -d "${TAB}" -f 3 abstract.tsv | sed "s/^\s*//" | \
        sed "s/\s*$//" | grep -v "^\s*$" | sort -f -S 300M | \
        uniq > referenced_images.sorted.tsv)

这是我收到的错误:
/bin/bash: -c: line 0: unexpected EOF while looking for matching `"'
/bin/bash: -c: line 1: syntax error: unexpected end of file

什么可能出了问题?

1
可能是 https://dev59.com/enE95IYBdhLWcg3wRLwt 的重复问题。 - Bill Lynch
1
只是提供信息,sed 的两个调用和 grep 的一个可以合并为一个 sed 实例:sed -ne '/^\s*$$/!{s/^\s*//;s/\s*$$//;p;}' 初始模式保留了仅包含空格和空行的内容,以免被修改或显示。(当然,我已经将 $ 值加倍了,以便于 make 的使用。) - William
1个回答

34

有一个错误来自于sed。当你写:

sed "s/\s*$//"

make会将变量$/扩展为空字符串,因此sed缺少分隔符。尝试:

sed "s/\s*$$//"

grep 中使用 $" 会导致相同的问题。请改用 grep -v "^\s*$$"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接