2014-08-28 43 views
0

我有一个变量,例如:Make:如何替换make变量中的字符?

export ITEM={countryname} 

这可以是:

"Albania", 
    "United States" // with space 
    "Fs. Artic Land" // dot 
    "Korea (Rep. Of)" // braket 
    "Cote d'Ivoir" // ' 

这个变量$(ITEM)被传递到其他命令,一些需要是因为它(细,我将使用$(ITEM)),一些MUST HAVE字符替换,通过实例,去与mkdir -p ../folder/{countryname}

"Albania"   // => Albania 
    "United States" // => United_States 
    "Fs. Artic Land" // => Fs\._Artic_Land 
    "Korea (Rep. Of)" // => Korea_\(Rep\._Of\) 
    "Cote d'Ivoire" // => Cote_d\'Ivoire 

所以我需要一个新的化妆杂物竹叶提取这种

export ITEM={countryname} 
export escaped_ITEM=$(ITEM).processed_to_be_fine 

我应该怎么做我的makefile内这个字符替换?(保持简单,不必做外部脚本)。我正在考虑使用一些transclude tr什么的。

注意:在Ubuntu上工作。

+1

该变量的字面意思是该字符串的内容(与'['和引号和逗号,但可能不与'/ /'评论)?如果您在shell级别的引号内使用它们(例如'mkdir -p“科特迪瓦”'和'mkdir -p“Korea(Rep。Of)”''工作,您不需要转义任何字符串没问题。) – 2014-08-28 18:41:11

+0

我的make run mkdir -p Cote d'Ivoire这不起作用。 – Hugolpz 2014-08-28 19:09:50

+1

是的,请注意你是如何不引用该目录名称的,而且我也这样做了。这很重要。 – 2014-08-28 19:12:20

回答

2

您可以使用GNU Make中的subst函数来执行替换。

escaped_ITEM := $(subst $e ,_,$(ITEM)) 

(其中$e是未定义或空可变的;得益于@EtanReisner指点出来)。但是,对于每个单独的替换,您将需要一个subst

如果可能的话,我会建议不要这样做,但是 - 使用单个机器可读的标记作为文件名,并将它们映射到只能作为最后一步的人可读。这也是在你的Makefile要容易得多:

human_readable_us=United States 
human_readable_kr=Korea (Rep. of) 
human_readable_ci=Côte d'Ivoire 
human_readable_tf=FS. Antarctic Lands 

stuff: 
     echo "$(human_readable_$(ITEM))" 
+1

'subst'需要是'$(subst $ e,_,$(ITEM))'(其中'$ e'只是任何空的变量,甚至不需要定义)或者make不会看到那里的空间。 – 2014-08-28 19:15:36

+0

我在想反斜杠,但没有去测试任何东西。无论如何这将工作;谢谢。 – tripleee 2014-08-28 19:26:00

+0

感谢有关切换到机器可读键的反馈。我会看看我的数据是否可能。 – Hugolpz 2014-08-28 19:52:24

1

鉴于输入简单的外壳使用它们将正常工作(这里显示的几个),但双引号任意的字符串是不是当“引用”国“名”因为任何数量的东西仍然可以在双引号内进行评估(并且使得字符串本身在双字引号中运行甚至会导致问题)。

如果您需要通过“随机”字符串壳他们只有一个安全的方式做到这一点:与'\''替换字符串中的'每个实例(单引号),然后包裹在字符串中'(单引号)。 (根据消费者的字符串替换每个'\047也可以工作。)