2012-05-03 11 views
5

Nie jestem pewien, czy opisałem pytanie poprawnie, ale obecnie mam rozwiązać ten problem w następujący sposóbJak przekonwertować cytowany ciąg na normalny w pliku Makefile?

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

Czy istnieje bardziej wbudowaną sposób, że „make” może zrobić to bez zawijania skorupę ? Dzięki

+2

Czy cytowany ciąg zawiera znaki specjalne? Mam na myśli np. "Cytaty \" wewnątrz \ "cytowany ciąg znaków". –

+0

@EldarAbusalimov Obecnie nie. Moja sytuacja jest dość prosta. –

Odpowiedz

6

Inna opcja: odpowiedź

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

Beta będzie usunąć każdy cytat w ciągu. Powyższe rozwiązanie WYŁĄCZNIE usuwa cytaty pojawiające się na początku i na końcu. Na przykład: odpowiedź

QUOTEDSTR := -DTITLE=\"Title\" 

Beta będzie skutkować wartości -DTITLE=\Title\ podczas korzystania z rozwiązania patsubst wartość ta nie zostanie zmieniona.

To zależy od tego, co chcesz.

EDIT

Jeśli chcesz obsługiwać tylko spacje i nadal pasuje cytaty na początku/końca zmiennej jak na użytkownika @ stefanct komentarz, musisz zagrać kilka sztuczek. Najpierw musisz znaleźć znak spoza białej spacji, który, jak wiesz, nigdy nie pojawi się w twoim ciągu. Wybierzmy ^, ale możesz wybrać coś innego, jeśli chcesz.

Algorytm jest: przekształcić wszystkie przestrzenie do tej postaci, a następnie usunąć cytaty z uzyskanej pojedynczej „słowo”, a następnie przekonwertować wszystkie wystąpienia tego znaku z powrotem do przestrzeni, tak:

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

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

Oczywiście wciąż są komplikacje; to obsługuje tylko spacje na przykład, a nie inne białe znaki, takie jak TAB.

+1

Skompresowana wersja twojej odpowiedzi może być: NORMALSTR = $ (QUOTEDSTR:"% "=%), która zasadniczo działa tak samo. – dirac3000

5

To powinno wystarczyć:

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

Świetnie. To działa. Czy mógłbyś wyjaśnić, co $ \ "znaczy? –

1

Wszystkie odpowiedzi mają jeszcze problemy. patsubst "[f] inds słowa rozdzielone spacjami", więc proste rozwiązanie @MadScientist nie działa dla ciągów takich jak "hello world". Z kolei przez @Beta usuwa wszystkie znaki cudzysłowu bez względu na to, gdzie się znajdują.

Poniższy kod pokazuje, jak radzić sobie z ciągami zawierającymi spacje. Jednak usunie również inne cudzysłowy na krawędzi słów, na przykład "hello "world"3" zostanie przekształcone na hello world"3. Jeśli to lepiej ... Nie wiem, prawdopodobnie nie.

Zamiast innych rozwiązań ten tworzy funkcję użytkownika o nazwie unquote zamiast bezpośrednio zastępować łańcuchy.

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)) 

To po prostu wygląda na wszystkich cytatów na początku i na końcu każdego (white-space oddzielone) słowa i usuwa go.

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

równa

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

ponieważ nie definiują $ \ zmienna, więc jest łańcuchem pustym

$\" unikać problem podświetlenia składni w edytorze.

",,$(QUOTEDSTR)) zostanie rozpoznany jako ciąg przez redaktora, dopóki nie znajdzie kolejnego ".

Powiązane problemy