2012-05-03 8 views
5

쉘을 호출하지 않고이 작업을 수행 할 수있는 '확인'이 더 내장 방법이 있나요 내가 질문을 제대로 설명했는지 잘 모르겠지만, 현재 나는 다음과 같은 방법Makefile에서 인용 문자열을 일반 문자열로 변환하는 방법은 무엇입니까?

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

이 문제를 해결하고 ? 감사합니다

+2

인용 문자열에 이스케이프 문자가 포함되어 있습니까? 내 말은. \ "따옴표 붙은 문자열 안에"\ "따옴표 \"가 있습니다. –

+0

@ EldarAbusalimov 현재 없습니다. 제 상황은 아주 간단합니다. –

답변

6

또 다른 옵션 :

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

베타의 대답은 문자열의 모든 견적을 제거합니다. 위의 솔루션은 시작과 끝 부분에 나타나는 따옴표 만 제거합니다. 예를 들어이 값이 변경되지 않습니다 patsubst는 솔루션을 사용하는 동안

QUOTEDSTR := -DTITLE=\"Title\" 

베타의 대답은 -DTITLE=\Title\의 값을 발생합니다.

원하는 항목에 따라 다릅니다.

편집

당신이 공백을 처리하는 및 여전히 @ 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)) 

에 당신은 $ \ 변수를 정의하지 않았다, 그래서 널 (null) 문자열을 편집기에서 강조 문제를 구문

$\" 피하고을하기 때문이다.

",,$(QUOTEDSTR))은 다른 사람이 "을 찾을 때까지 편집기에 의해 문자열로 인식됩니다.

관련 문제