2014-08-28 39 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也可以工作。)