如何在Makefile中将带引号的字符串转换为普通字符串?

时间:2012-05-03 03:21:23

标签: makefile

我不确定我是否已正确描述了这个问题,但目前我正在通过以下方式解决这个问题

QUOTEDSTR := "hello world"
NORMALSTR := $(shell echo $(QUOTEDSTR))

是否有一种更加内置的方式'make'可以在不调用shell的情况下执行此操作?感谢

4 个答案:

答案 0 :(得分:9)

另一种选择:

NORMALSTR := $(patsubst "%",%,$(QUOTEDSTR))

Beta的答案将删除字符串中的每个引号。上述解决方案只会删除出现在开头和结尾的引号。例如:

QUOTEDSTR := -DTITLE=\"Title\"

Beta的回答将导致值为-DTITLE=\Title\,而使用patsubst解决方案时,此值不会更改。

这取决于你想要什么。

<强> 修改

如果您想要处理空格并且仍然只根据@ stefanct的评论在变量的开头/结尾匹配引号,那么您将不得不玩一些技巧。首先,您需要找到一个非空白字符,您知道该字符永远不会出现在字符串中。我们选择^但您可以根据需要选择其他内容。

算法是:将所有空格转换为此字符,然后从生成的单个“单词”中删除引号,然后将该字符的所有实例转换回空格,如下所示:

# Get a variable S that contains a single space
E :=
S := $E $E

NORMALSTR := $(subst ^,$S,$(patsubst "%",%,$(subst $S,^,$(QUOTEDSTR))))

当然还有并发症;例如,它只处理空格,而不处理其他空格字符,如TAB。

答案 1 :(得分:7)

这应该这样做:

NORMALSTR := $(subst $\",,$(QUOTEDSTR))

答案 2 :(得分:1)

所有答案都有问题。 patsubst&#34; [f] inds以空格分隔的单词&#34;所以@MadScientist的简单解决方案不适用于像"hello world"这样的字符串。另一方面,@ Beta的那个删除所有引用字符,无论它们在哪里。

下面的代码展示了如何处理包含空格的字符串。但是,它还会删除单词边缘的其他引号字符,例如"hello "world"3"将转换为hello world"3。如果那更好......我不知道,可能不是。

而不是其他解决方案,这个解决方案创建一个名为unquote的用户函数,而不是直接替换字符串。

quoted="hello world"

unquote = $(patsubst "%,%,$(patsubst %",%,$(1)))
#unquote = $(subst $\",,$(1))
#unquote = $(patsubst "%",%,$(1))
#unquote = $(shell echo $(1))

unquoted = $(call unquote,$(quoted))

$(info Variable quoted is $(quoted))
$(info Variable unquoted is $(unquoted))

这只是在每个(空格分隔的)单词的开头和结尾查找所有引号字符并将其删除。

答案 3 :(得分:-1)

NORMALSTR := $(subst $\",,$(QUOTEDSTR))

等于

NORMALSTR := $(subst ",,$(QUOTEDSTR))

因为你没有定义$ \ variable,所以它是空字符串

$\"避免在编辑器中出现语法高亮问题。

",,$(QUOTEDSTR))将被编辑器识别为字符串,直到找到另一个"