2012-05-03 41 views
5

Tôi không chắc chắn cho dù tôi đã mô tả những câu hỏi đúng, nhưng hiện tại tôi đang giải quyết vấn đề này theo cách sauLàm thế nào để chuyển đổi một chuỗi trích dẫn thành một bình thường trong Makefile?

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

Có cách nào tích hợp hơn là 'make' có thể làm điều này mà không gọi shell ? Cảm ơn

+2

Bạn có trích dẫn chuỗi bao gồm bất kỳ ký tự thoát nào không? Ý tôi là, ví dụ: "Quotes \" bên trong \ "một chuỗi trích dẫn". –

+0

@EldarAbusalimov Hiện tại không có. Tình hình của tôi khá đơn giản. –

Trả lời

6

Một tùy chọn khác: câu trả lời

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

Beta sẽ loại bỏ tất cả các trích dẫn trong chuỗi. Giải pháp trên sẽ CHỈ loại bỏ các dấu ngoặc kép xuất hiện ở đầu và cuối. Ví dụ: Câu trả lời

QUOTEDSTR := -DTITLE=\"Title\" 

Beta sẽ dẫn đến một giá trị của -DTITLE=\Title\ trong khi sử dụng các giải pháp patsubst giá trị này sẽ không thay đổi.

Tùy thuộc vào những gì bạn muốn.

EDIT

Nếu bạn muốn xử lý khoảng trắng và vẫn chỉ phù hợp với dấu ngoặc kép vào đầu/kết thúc của biến theo bình luận @ stefanct, bạn sẽ phải chơi một số thủ thuật. Trước tiên, bạn cần phải tìm một ký tự không khoảng trống mà bạn biết sẽ không bao giờ xuất hiện trong chuỗi của bạn. Hãy chọn ^ nhưng bạn có thể chọn cái gì khác nếu bạn muốn.

Thuật toán là: chuyển đổi tất cả không gian để nhân vật này, sau đó loại bỏ các dấu ngoặc kép từ kết quả đơn "chữ", sau đó chuyển đổi tất cả các trường hợp của nhân vật mà lại không gian, như thế này:

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

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

Dĩ nhiên vẫn còn những biến chứng; điều này chỉ xử lý các khoảng trống chẳng hạn, không phải các ký tự khoảng trắng khác như TAB.

+1

Một phiên bản nén của câu trả lời của bạn có thể là: NORMALSTR = $ (QUOTEDSTR:"% "=%) về cơ bản giống nhau. – dirac3000

5

này nên làm điều đó:

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

Tuyệt vời. Nó hoạt động. Bạn có thể giải thích $ \ "có nghĩa là gì? –

1

Tất cả câu trả lời đều gặp sự cố. patsubst "[f] inds cách nhau khoảng trắng khoảng cách" do đó, giải pháp đơn giản bởi @MadScientist không hoạt động cho các chuỗi như "hello world". Cái của @Beta mặt khác loại bỏ tất cả các ký tự trích dẫn cho dù chúng ở đâu.

Mã bên dưới cho biết cách xử lý các chuỗi có dấu cách trong chúng. Tuy nhiên, nó cũng sẽ xóa các ký tự trích dẫn khác trên các cạnh của từ, ví dụ "hello "world"3" sẽ được chuyển thành hello world"3. Nếu đó là tốt hơn ... Tôi không biết, có lẽ không.

Thay vì các giải pháp khác, giải pháp này tạo ra chức năng người dùng có tên unquote thay vì trực tiếp thay thế chuỗi.

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

Điều này chỉ đơn giản là tìm tất cả các ký tự trích dẫn ở đầu và cuối mỗi từ (cách nhau khoảng trắng) và loại bỏ.

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

bằng

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

vì bạn đã không xác định \ $ biến, vì vậy nó là null chuỗi

$\" tránh cú pháp vấn đề nổi bật trong trình soạn thảo.

",,$(QUOTEDSTR)) sẽ được Công nhận là một chuỗi cho đến khi tìm thấy một số khác ".

Các vấn đề liên quan