Makefile 使subst不能按我希望的方式工作

Makefile 使subst不能按我希望的方式工作,makefile,gnu-make,Makefile,Gnu Make,我试图使用makefile“subst”函数来分割文本。这是我的密码 $(subst :,\nvalue:,peter:value:2) 我想做的是从第一个出现的“:”中分离出来。但它在第二次出现时也会分裂。有人能帮我解决这个问题吗。结果她可能与下面相似 peter\nvalue:value:2 如文档所述,subst函数用新文本替换原始文本的每一次出现 如果你只想要第一个冒号,你必须要有更多的想象力,如果你想在make中完全做到这一点,而你对第一个冒号前后的文本一无所知。像这样的方法应该会

我试图使用makefile“subst”函数来分割文本。这是我的密码

$(subst :,\nvalue:,peter:value:2)
我想做的是从第一个出现的“:”中分离出来。但它在第二次出现时也会分裂。有人能帮我解决这个问题吗。结果她可能与下面相似

peter\nvalue:value:2

如文档所述,subst函数用新文本替换原始文本的每一次出现

如果你只想要第一个冒号,你必须要有更多的想象力,如果你想在make中完全做到这一点,而你对第一个冒号前后的文本一无所知。像这样的方法应该会奏效:

VAL := peter:value:2
NEW := $(patsubst $(firstword $(subst :, ,$(VAL)))%,$(firstword $(subst :, ,$(VAL)))\nvalue%,$(VAL))

也许有一种更简单的方法可以做到这一点;我必须考虑一下。

正如文档所述,subst函数用新文本替换原始文本的每一次出现

如果你只想要第一个冒号,你必须要有更多的想象力,如果你想在make中完全做到这一点,而你对第一个冒号前后的文本一无所知。像这样的方法应该会奏效:

VAL := peter:value:2
NEW := $(patsubst $(firstword $(subst :, ,$(VAL)))%,$(firstword $(subst :, ,$(VAL)))\nvalue%,$(VAL))

也许有一种更简单的方法可以做到这一点;我必须考虑一下。

如果您不介意让调用shell来执行此操作,您可以执行以下操作:

VAL := peter:value:2
NEW := $(shell echo "$(VAL)" | sed -e 's/:/\\nvalue:/')
我不确定您的
\n
是文字“\n”还是换行符。我假设是前者。这意味着
sed
表达式中的
\n
需要作为
\\n
转义


另一种完全在make中实现的方法(无需任何shell调用):


警告:如果原始值包含空格,此方法将给出不正确的结果。

如果您不介意让make调用shell来执行此操作,则可以执行以下操作:

VAL := peter:value:2
NEW := $(shell echo "$(VAL)" | sed -e 's/:/\\nvalue:/')
我不确定您的
\n
是文字“\n”还是换行符。我假设是前者。这意味着
sed
表达式中的
\n
需要作为
\\n
转义


另一种完全在make中实现的方法(无需任何shell调用):


警告:如果原始值中包含空格,此方法将给出不正确的结果。

如果原始值中有空格,则所有这些都会导致错误。@EtanReisner-非常正确。我将在答案中添加这一警告。如果原始值中有空格,则所有这些都会使它无法正常工作。@EtanReisner-非常正确。我将在答案中添加这个警告。一个警告:如果第一个
前面的部分可以包含空格,那么这不起作用。是的,非常正确。一般来说,make不喜欢空白。有一点需要注意:如果第一个
前面的部分可以包含空格,则此操作无效。是的,非常正确。一般来说,make不喜欢空白。