1

我在 GNU make 文件中有一个变量:

VAR=DDC

我想将这些字符合并到另一个字符串中并将它们分配给不同的变量,例如:

TOT_VAR=--'D','D','C'--

我的第一个想法是做这样的伪代码:

#Pseudo code
TOT_VAR=--'@(letter1, VAR)','@(letter2, VAR)','@(letter3, VAR)'--

但我找不到任何提取单个字符的函数。我该怎么做?

4

2 回答 2

1

您可以用来sed进行转换:

echo DDC | sed -E "s/^(.{1})(.{1})(.{1}).*/--'\1','\2','\3'--/")

这是做什么的:

  1. 将字符串通过管道DDC传输到sed
  2. 告诉sed解析字符串并匹配前三个字符
  3. 替换DDC您的替换格式,将这三个字符插入占位符\1\2并且\3

[如果您使用的是 Linux 操作系统而不是像我这样的 MacOS,那么我认为您需要使用sed -e而不是sed -E]

正如@Maxim 的评论所说,您需要调用 shellmake才能运行此命令。将此方法构建到一个简单的 makefile 中来说明:

VAR=DDC
TOT_VAR:=$(shell echo $(VAR) | sed -E "s/^(.{1})(.{1})(.{1}).*/--'\1','\2','\3'--/")

all:
    echo "$(TOT_VAR)"

在此运行make all会产生此输出并显示替换有效:

echo "--'D','D','C'--"
--'D','D','C'--
于 2018-05-11T23:17:32.517 回答
0

GNU 表工具包有一个函数explode可以将字符串扩展为列表:

$(调用explode, stringlist , string )

在 string 中的 stringlist 中每次出现字符串后插入一个空格。该函数主要用于将字符串转换为列表:

$(call explode,0 1 2 3 4 5 6 7 8 9,0x1337c0de) --> 0 x1 3 3 7 c0 de

您可以访问变量的成员,如下所示:

include gmtt/gmtt.mk
XPLD_VAR := $(call explode,$([alnum]),$(VAR))
TOT_VAR := --$(word 1,$(XPLD_VAR)),$(word 2,$(XPLD_VAR)),$(word 3,$(XPLD_VAR))--
于 2018-05-14T10:29:26.327 回答