2012-05-03 27 views
5

我不知道我是否正確描述的問題,但目前我以下列方式如何在Makefile中將引用字符串轉換爲正常字符串?

QUOTEDSTR := "hello world" 
NORMALSTR := $(shell echo $(QUOTEDSTR)) 

解決這個問題有沒有更內置的方式,「使」可以做到這一點,而不調用shell ?由於

+2

你引用的字符串是否包含任何轉義字符?我的意思是,例如「報價單」在「一個帶引號的字符串」裏面。 –

+0

@EldarAbusalimov目前沒有。我的情況很簡單。 –

回答

6

另一種選擇:

NORMALSTR := $(patsubst "%",%,$(QUOTEDSTR)) 

測試版的答案將刪除所有報價的字符串中。上述解決方案將僅刪除出現在開頭和結尾處的引號。例如:

QUOTEDSTR := -DTITLE=\"Title\" 

貝塔的回答將導致-DTITLE=\Title\一個值,而使用patsubst解決這個值不會改變。

這取決於你想要什麼。

編輯

如果你想處理的空白,也是目前唯一匹配的可變的開始/結束引號按@ stefanct的評論,你必須打一些技巧。首先,你需要找到一個非空白字符,你知道它將永遠不會出現在你的字符串中。我們選擇^,但如果你願意,你可以選擇其他的東西。

的算法是:將所有空格這個字符,然後從產生單一的「字」的報價,然後再轉換角色的所有實例回到空間,就像這樣:

# Get a variable S that contains a single space 
E := 
S := $E $E 

NORMALSTR := $(subst ^,$S,$(patsubst "%",%,$(subst $S,^,$(QUOTEDSTR)))) 

當然仍然存在併發症;這隻處理空格,而不是其他空格字符,如TAB。

+1

答案的壓縮版本可能是:NORMALSTR = $(QUOTEDSTR:」%「=%),它基本上是一樣的。 – dirac3000

5

這應做到:

NORMALSTR := $(subst $\",,$(QUOTEDSTR)) 
+1

太好了。有用。你能解釋$ \「是什麼意思嗎? –

1

所有的解答有問題。 patsubst「[F] INDS空格分隔單詞」,所以由@MadScientist簡單的解決方案不適用於像"hello world"字符串工作。另一方面,由@Beta所做的一個刪除所有引號字符,無論它們在哪裏。

下面的代碼演示瞭如何處理與空格的字串。然而,它也將在字的邊緣去除其它引號字符,例如"hello "world"3"將被轉換到hello world"3。如果這更好......我不知道,可能不是。

取而代之的是其他解決方案的這一個創建一個名爲unquote而不是直接替換字符串用戶的功能。

quoted="hello world" 

unquote = $(patsubst "%,%,$(patsubst %",%,$(1))) 
#unquote = $(subst $\",,$(1)) 
#unquote = $(patsubst "%",%,$(1)) 
#unquote = $(shell echo $(1)) 

unquoted = $(call unquote,$(quoted)) 

$(info Variable quoted is $(quoted)) 
$(info Variable unquoted is $(unquoted)) 

這只是看起來在每一個分離(空白)的開始和結束所有引號字符單詞並將其刪除。

-1
NORMALSTR := $(subst $\",,$(QUOTEDSTR)) 

等於

NORMALSTR := $(subst ",,$(QUOTEDSTR)) 

,因爲你沒有定義$ \變量,所以它是空字符串

$\"避免語法高亮問題編輯器。

",,$(QUOTEDSTR))將被編輯器識別爲字符串,直到找到另一個"

相關問題