GNU Makefile中实现变量右对齐填充的技术咨询
在GNU Makefile中实现变量右对齐并拆分的方案
我来帮你搞定这个变量处理的需求!要把读取到的1-3字符变量转换成右对齐的形式(比如U变成前两位空、第三位是U),我们可以用两种思路实现,一种是借助Shell命令一步到位,另一种是纯用Make的内置函数处理,下面分别说明:
方法一:Shell命令直接处理对齐
既然你已经用shell函数读取变量,那可以在读取的同时用printf完成右对齐格式化,这样得到的变量直接就是3位右对齐的结果,之后再拆分即可:
# 读取并直接右对齐格式化,%3s表示总宽度3位,自动在左侧补空格 VAR := $(shell grep -w "variable=" textfile.txt | cut -c 10-13 | awk '{printf "%3s", $$0}') # 拆分变量到三个位置,空位置会是空格;如果需要空字符串而非空格,可加判断 VAR0 := $(if $(filter $(VAR:0:1), ),,$(VAR:0:1)) VAR1 := $(if $(filter $(VAR:1:1), ),,$(VAR:1:1)) VAR2 := $(VAR:2:1)
解释:
printf "%3s"会把输入的字符串格式化为总长度3的右对齐字符串,比如输入U得到U,输入V3得到V3,输入XXX得到XXX- 后面的
if判断是把空格转换成空字符串,如果你的需求里“空”指的是空格,那可以直接用VAR0=$(VAR:0:1)即可
方法二:纯Make内置函数实现(无额外Shell调用)
如果想避免频繁调用Shell,也可以用Make的内置函数来计算长度并补空格:
# 先读取原始变量 RAW_VAR := $(shell grep -w "variable=" textfile.txt | cut -c 10-13) # 计算变量长度(GNU Make 4.2+支持$(len)函数,旧版本可替换为shell命令:$(shell echo -n "$(RAW_VAR)" | wc -c)) VAR_LEN := $(len $(RAW_VAR)) # 根据长度补空格实现右对齐 ALIGNED_VAR := $(if $(eq $(VAR_LEN),1), $(RAW_VAR),$(if $(eq $(VAR_LEN),2), $(RAW_VAR),$(RAW_VAR))) # 拆分到三个变量,同样可按需转换空格为空字符串 VAR0 := $(if $(filter $(ALIGNED_VAR:0:1), ),,$(ALIGNED_VAR:0:1)) VAR1 := $(if $(filter $(ALIGNED_VAR:1:1), ),,$(ALIGNED_VAR:1:1)) VAR2 := $(ALIGNED_VAR:2:1)
解释:
- 用
$(len)获取原始变量的长度,根据长度判断需要补几个前置空格:长度1补2个,长度2补1个,长度3不补 - 拆分逻辑和方法一一致,按需处理空格转空字符串的需求
你可以根据自己的Make版本和偏好选择其中一种方案,两种都能实现你要的右对齐拆分效果~
内容的提问来源于stack exchange,提问作者Sharky
相关产品推荐
相关产品推荐

