único varios varias usar usa siguientes que para palabras maximo macro los filtro filtrar ejercicios cuál criterios contiene contenga con comodín comodines comodin carácter caracteres buscar avanzado filter makefile wildcard

filter - varias - macro filtro avanzado varios criterios



Makefile: cómo aplicar un equivalente para filtrar en varios comodines (3)

Puede hacerlo sin ejecutar ningún comando externo. Definir las dos macros

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

Ahora puedes hacer

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

Estoy escribiendo un Makefile y me quedo atascado en una limitación de función de filtro. De hecho, el filtro solo tiene un comodín.

Lo que me gustaría hacer es: tengo una lista de archivos, algunos que coincidan con la expresión regular , otros no. Pero para esto necesito 2 comodines, así no puedo usar la función de filtro.

Me gustaría dividir mi lista original en 2 listas, una contiene todo el elemento que contiene la cadena blabla (filtro equivalente) y la otra que contiene la cadena que no coincide (equivalente de filtrado).

gracias por tu ayuda.


Una de las mayores deficiencias de Make es su poca capacidad para manejar expresiones regulares. Las funciones de filter y filter-out no pueden encontrar "viejo" en el medio de una palabra. Sugeriría este truco:

NOT_OLD = $(shell echo $(LIST) | sed ''s/[^ ]*old[^ ]* *//g'') OLD = $(filter-out $(NOT_OLD), $(LIST))


Podría aprovechar las capacidades de manejo de cadenas más avanzadas de su caparazón. Suponiendo que tiene bash , podría usar lo siguiente en su 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))

Puede encontrar una explicación del mecanismo de reemplazo de cadena bash en cómo eliminar elementos de una matriz en función de un patrón . Se requiere el doble $ para mantener el signo $ en la invocación del shell.