2012-05-03 11 views
5

kabuk uğramadan yapabilirsiniz 'yapmak' bir daha yerleşik bir yolu var mı ben soruyu düzgün nitelendirdiler emin değilim, ama şu anda ben şu şekildeMakefile'de bir Queded String'i Normal Bir'e Dönüştürme?

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

bu sorunu çözme am ? Teşekkür

+2

Dize alıntı dizesi kaçış karakterleri içeriyor mu? Yani, örn. \ "Alıntılanan bir dizge" içinde "Tırnaklar". –

+0

@EldarAbusalimov Şu an için. Benim durumum oldukça basit. –

cevap

6

Başka bir seçenek:

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

Beta'nın cevabı dizede her teklifi kaldıracaktır. Yukarıdaki çözüm SADECE başında ve sonunda görünen tırnakları kaldıracaktır. Örneğin: bu değer değişmeyecektir patsubst çözüm kullanırken

QUOTEDSTR := -DTITLE=\"Title\" 

Beta'nın cevabı -DTITLE=\Title\ değeri ile sonuçlanacaktır.

Ne istediğinize bağlı olarak değişir.

DÜZENLEME

bu boşluğu ele almak istiyor ve hala sadece @ stefanct yorumuna göre değişken başlangıcı/sonu alıntı bulunamadı, bazı oyun oynar gerekecek. Öncelikle dizinizde görünmeyeceğini bildiğiniz bir boşluk olmayan karakter bulmanız gerekir. ^'u seçelim ama isterseniz başka bir şey seçebilirsiniz.

algoritmadır: Elbette

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

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

: o zaman bu gibi mekanlara tekrar o karakterin tüm örneklerini dönüştürmek, daha sonra ortaya çıkan tek bir "kelime" den alıntılar kaldırmak, bu karaktere tüm boşlukları dönüştürmek hala komplikasyonlar var; Bu, örneğin, SEKME gibi diğer boşluk karakterlerini değil, yalnızca boşlukları işler.

+1

Cevabınızın sıkıştırılmış bir sürümü olabilir: NORMALSTR = $ (QUOTEDSTR:"% "=%) temelde aynıdır. – dirac3000

5

Bu yapmalıyım:

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

Harika. İşe yarıyor. $ \ "Demek ne anlama gelir? Lütfen, –

1

Tüm yanıtlar henüz sorunlarınız yok. patsubst "[f] boşluklarla ayrılmış kelimeler" yani, @MadScientist tarafından basit çözüm, "hello world" gibi dizeler için çalışmaz. Diğer taraftan @Beta, nerede olursa olsun tüm alıntı karakterlerini kaldırır.

Aşağıdaki kod, dizelerle boşluklarla nasıl başa çıkılacağını gösterir. Ancak, diğer alıntı karakterlerini de sözcüklerin kenarlarında kaldıracaktır, örneğin "hello "world"3"hello world"3'a dönüştürülecektir. Eğer daha iyi olursa ... Bilmiyorum, muhtemelen değil.

Diğer çözümler yerine bu, dizeleri doğrudan değiştirmek yerine unquote adında bir kullanıcı işlevi oluşturur.

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

Bu sadece her (ayrılmış beyaz boşluk) başında ve sonunda tüm tırnak karakterleri kelimesine arar ve kaldırır.

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

eşit

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

Sizin $ \ değişken tanımlamak yoktu, bu yüzden boş dize editörü vurgulamak sorunu söz diziminde

$\" avoid çünkü.

",,$(QUOTEDSTR)), başka bir " bulmak için Editör tarafından bir dize olarak tanınacaktır.

İlgili konular