6

Makefile を書いていますが、フィルター機能の制限に行き詰まりました。実際、filter はワイルドカードを 1 つだけ使用します。

私がやりたいことは次のとおりです。ファイルのリストがあり、正規表現blablaに一致するものと一致しないものがあります。しかし、これには2つのワイルドカードが必要なため、フィルター機能を使用できません。

元のリストを 2 つのリストに分割したいと思います。1 つは blabla 文字列を含むすべての要素を含み (フィルターに相当)、もう 1 つは一致しないものを含みます (フィルターアウトに相当)。

ご協力いただきありがとうございます。

4

3 に答える 3

10

これは、外部コマンドを実行しなくても実行できます。2 つのマクロを定義する

containing = $(foreach v,$2,$(if $(findstring $1,$v),$v))
not-containing = $(foreach v,$2,$(if $(findstring $1,$v),,$v))

今、あなたはすることができます

LIST := a_old_tt x_old_da a_new_da q_ty_we
LIST_OLD := $(call containing,old,$(LIST))
LIST_NOT_OLD := $(call not-containing,old,$(LIST))
于 2012-09-07T19:45:21.303 に答える
3

Make の最大の欠点の 1 つは、正規表現を処理する能力が低いことです。機能filterfilter-out、単語の途中で「古い」を見つけることができません。このハックをお勧めします:

NOT_OLD = $(shell echo $(LIST) | sed 's/[^ ]*old[^ ]* *//g')
OLD = $(filter-out $(NOT_OLD), $(LIST))
于 2012-09-07T16:13:40.037 に答える
1

シェルのより高度な文字列処理機能を利用できます。を持っていると仮定するとbash、 で次を使用できますmakefile

LIST := a_old_tt x_old_da a_new_da q_ty_we
LIST_NOT_OLD := $(shell l=($(LIST)); echo $${l[@]//*old*})
LIST_OLD := $(filter-out $(LIST_NOT_OLD),$(LIST))

パターンに基づいて配列から要素を削除する方法で、bash 文字列置換メカニズムの説明を見つけることができます。シェル呼び出しで符号を保持するにはdouble$が必要です。$

于 2012-09-07T16:31:14.280 に答える