9

質問をきちんと説明したかどうかはわかりませんが、現在、この問題を次のように解決しています。

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

'make'がシェルを呼び出さずにこれを実行できるより組み込みの方法はありますか?ありがとう

4

4 に答える 4

15

別のオプション:

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などの他の空白文字は処理しません。

于 2012-05-03T15:41:12.003 に答える
10

これはそれを行う必要があります:

NORMALSTR := $(subst $\",,$(QUOTEDSTR))
于 2012-05-03T12:01:34.717 に答える
2

すべての回答にはまだ問題があります。patsubst「[f]は空白で区切られた単語を示します」ので、@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))

これは、すべての(空白で区切られた)単語の先頭と末尾にあるすべての引用文字を検索して削除します。

于 2015-09-05T17:15:15.837 に答える
-1
NORMALSTR := $(subst $\",,$(QUOTEDSTR))

に等しい

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

$ \変数を定義しなかったため、null文字列になります

$\"エディターでシンタックスハイライトの問題を回避します。

",,$(QUOTEDSTR))別のが見つかるまで、エディターによって文字列として認識されます"

于 2015-12-01T07:39:26.877 に答える