我不确定我是否已正确描述了这个问题,但目前我正在通过以下方式解决这个问题
QUOTEDSTR := "hello world"
NORMALSTR := $(shell echo $(QUOTEDSTR))
是否有一种更加内置的方式'make'可以在不调用shell的情况下执行此操作?感谢
答案 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))
将被编辑器识别为字符串,直到找到另一个"
。