2017-09-18 3 views
1

Hier ist mein Makefile und der Ausgang, wie der Bereich wie [1-5, 7, 9-10] zu drucken?Wie berechnet man den Bereich in 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

-I-Format-Shell-Befehle aufrufen können, wenn das helfen geht. – rodee

+0

Suchen Sie nur nach einer Makefile-Lösung oder akzeptieren Sie auch ein Bash-Skript? – anubhava

+1

Bash ist auch in Ordnung, ich kann eine Shell-Befehle von meinem Makefile aufrufen. – rodee

Antwort

0

ist Pipeline von Shell-Befehle Ihre Arbeit zu erledigen:

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 

Befehle sind:

  1. printf jeden Dateinamen in separaten Zeilen drucken
  2. sed alles zu entfernen, außer Ziffern
  3. sort zu sortieren, um zu erhalten der Bereich, in richtigen Reihenfolge
  4. awk den Bereich zu setzen und die Ergebnisse
1

Es gibt mehrere Ansätze:

  1. Wenn Sie den maximal möglichen Wert kennen: Zuerst fügen SHELL=bash so dass die Verstrebung espansion funktioniert. Dann verwenden Sie etwas wie $(shell {1..10}), und übergeben Sie dieses Ergebnis durch $(wildcard), um nicht vorhandene Dateien auszuschließen.
  2. Rohrleitungen durch sort -n, wieder in $(shell).
  3. Pad-Nummern auf der linken Seite mit 0 s, dann normal sortieren. Hier
Verwandte Themen