9

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

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

有没有更内置的方式可以让“make”在不调用 shell 的情况下做到这一点?谢谢

4

4 回答 4

15

另外的选择:

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。

于 2012-05-03T15:41:12.003 回答
10

这应该这样做:

NORMALSTR := $(subst $\",,$(QUOTEDSTR))
于 2012-05-03T12:01:34.717 回答
2

所有答案都有问题。patsubst“[f]inds 空格分隔的单词”所以@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))

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

于 2015-09-05T17:15:15.837 回答
-1
NORMALSTR := $(subst $\",,$(QUOTEDSTR))

等于

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

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

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

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

于 2015-12-01T07:39:26.877 回答