2017-09-18 7 views
1

Voici mon Makefile et la sortie, comment imprimer la gamme comme [1-5, 7, 9-10]?Comment calculer la plage dans Makefile

$ ls /tmp/foo 
foo10.txt foo1.txt foo2.txt foo3.txt foo4.txt foo5.txt foo7.txt foo9.txt 

$ cat Makefile 
DIR1 := /tmp/foo/ 
COMMA :=, 
EMPTY := 
SPACE := $(EMPTY) $(EMPTY) 
VERSIONS := $(subst $(SPACE),$(COMMA),$(patsubst foo%,%,$(basename $(notdir $(wildcard $(DIR1)/foo*.txt))))) 
all: 
     $(info versions is [${VERSIONS}]) 

$ make 
versions is [10,1,2,3,4,5,7,9] 
+0

Je peux appeler des commandes shell, si cela va aider. – rodee

+0

Êtes-vous seulement à la recherche d'une solution Makefile ou acceptez-vous aussi un script bash? – anubhava

+1

Bash est bien aussi, je peux appeler une commande shell à partir de mon Makefile. – rodee

Répondre

0

est ici pipeline de commandes shell pour faire votre travail:

printf '%s\n' foo*[0-9].txt | 
sed 's/[^0-9]*//g' | 
sort -n | 
awk 'function prnt(sep){printf "%s%s", s, (p > s ? "-" p : "") sep} 
NR==1{s = $1} p < $1-1{prnt(","); s = $1} {p = $1} END{prnt(ORS)}' 

1-5,7,9-10 

Les commandes sont:

  1. printf pour imprimer chaque nom de fichier sur des lignes séparées
  2. sed pour enlever tout sauf chiffres
  3. sort pour trier numériquement pour obtenir la plage en séquence droite
  4. awk pour définir la portée et formater les résultats
1

Il existe plusieurs approches:

  1. Si vous connaissez la valeur maximale possible: Tout d'abord, ajoutez SHELL=bash de sorte que accolade espansion fonctionne. Ensuite, utilisez quelque chose comme $(shell {1..10}), et passez ce résultat par $(wildcard) pour exclure les fichiers inexistants.
  2. Pipe les lignes à travers sort -n, à nouveau dans $(shell).
  3. Numéros de pad sur la gauche avec 0 s, puis trier normalement.