Make:如何替换make变量中的字符?

时间:2014-08-28 18:33:37

标签: makefile

我有一个变量:

export ITEM={countryname}

这可以是:

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

这个变量$(ITEM)被传递给其他命令,有些需要就是它(很好,我将使用$(ITEM)),例如,某些必须有字符替换,以便与{{1}一起使用}:

mkdir -p ../folder/{countryname}

所以我需要一个新的make变量

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

我应该如何在makefile中进行此字符替换?(为了简单起见而不必执行外部脚本)。我正在考虑使用一些转换export ITEM={countryname} export escaped_ITEM=$(ITEM).processed_to_be_fine 或其他东西。

注意:在Ubuntu上工作。

2 个答案:

答案 0 :(得分:3)

您可以使用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 :(得分:2)

只需输入"引用"国家"名称"在shell中使用它们时工作正常(对于这里显示的少数几个)但是双引用任意字符串是不安全的,因为任何数量的东西仍然可以在双引号内进行求值(并且make的方式甚至可以在字符串中操作双引号导致问题)。

如果你需要通过"随机"字符串到shell它们只是一种安全的方法:用'替换字符串中的'\''(单引号)的每个实例,然后将字符串包装在'中(单个引号)。 (取决于使用'替换每个\047的字符串的使用者也可以。)

相关问题