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

Hug*_*lpz 3 makefile

我有一个这样的变量:

export ITEM={countryname}
Run Code Online (Sandbox Code Playgroud)

这可以是:

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

这个变量$(ITEM)被传递给其他命令,有些需要的是它(很好,我将使用$(ITEM)),有些必须有字符替换,例如,与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 
Run Code Online (Sandbox Code Playgroud)

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

export ITEM={countryname}
export escaped_ITEM=$(ITEM).processed_to_be_fine
Run Code Online (Sandbox Code Playgroud)

我应该如何在我的 makefile 中进行此字符替换?(为了让事情简单,不必执行外部脚本)。我正在考虑使用一些嵌入tr或其他东西。

注意:在 Ubuntu 上工作。

tri*_*eee 6

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

\n\n
escaped_ITEM := $(subst $e ,_,$(ITEM))\n
Run Code Online (Sandbox Code Playgroud)\n\n

(其中$e是未定义或空变量;感谢@EtanReisner 指出)。

\n\n

不过,每次单独替换都需要一个subst

\n\n

不过,如果可能的话,我建议不要这样做——使用单个机器可读的标记作为文件名,并将它们映射到人类可读的位置,仅作为最后一步。这在你的 makefile 中也更容易:

\n\n
human_readable_us=United States\nhuman_readable_kr=Korea (Rep. of)\nhuman_readable_ci=C\xc3\xb4te d\'Ivoire\nhuman_readable_tf=FS. Antarctic Lands\n\nstuff:\n        echo "$(human_readable_$(ITEM))"\n
Run Code Online (Sandbox Code Playgroud)\n