【问题标题】:How to Convert a Quoted String to a Normal One in Makefile?如何在 Makefile 中将带引号的字符串转换为普通字符串?
【发布时间】:2012-05-12 13:41:37
【问题描述】:

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

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

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

【问题讨论】:

  • 你引用的字符串是否包含任何转义字符?我的意思是,例如"引用 \"inside\" 一个带引号的字符串"。
  • @EldarAbusalimov 目前没有。我的情况很简单。

标签: makefile


【解决方案1】:

另一种选择:

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。

【讨论】:

  • 您的答案的压缩版本可能是:NORMALSTR = $(QUOTEDSTR:"%"=%) 基本相同。
【解决方案2】:

应该这样做:

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

【讨论】:

  • 太棒了。有用。你能解释一下 $\" 是什么意思吗?
【解决方案3】:

所有答案都有问题。 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))

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

【讨论】:

    【解决方案4】:
    NORMALSTR := $(subst $\",,$(QUOTEDSTR))
    

    等于

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 2014-08-06
      相关资源
      最近更新 更多