首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算Makefile中的范围

如何计算Makefile中的范围
EN

Stack Overflow用户
提问于 2017-09-18 21:12:50
回答 2查看 1.3K关注 0票数 1

这是我的生成文件和输出,如何打印像[1-5, 7, 9-10]这样的范围?

代码语言:javascript
复制
$ 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]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-19 19:36:59

下面是用于完成工作的shell命令的管道:

代码语言:javascript
复制
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

命令如下:

  1. printf将每个文件名打印在单独的行上
  2. sed删除除数字以外的所有内容
  3. sort对数字排序以得到正确的范围
  4. awk设置范围并格式化结果
票数 0
EN

Stack Overflow用户

发布于 2017-09-18 23:58:05

有几种方法:

  1. 如果您知道最大可能值:首先,添加SHELL=bash以便大括号展开工作。然后使用类似于$(shell {1..10})的内容,并通过$(wildcard)传递结果以排除不存在的文件。
  2. 管道通过sort -n,同样是在$(shell)
  3. 在左边使用0s的垫号,然后正常排序。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46288292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档