在列中打印以空格分隔的列表

时间:2012-05-21 14:13:09

标签: linux bash unix

我有这个Makefile,它有一个名为“MODULES”的变量,列出了我在构建中激活的所有模块。

此列表以空格分隔,因此当我执行echo $(MODULES)时,它看起来像这样:

module1 module2 module3 module4 mod5 mod6 mod7 module8 module9

我想要做的是在编译时显示的某些列中显示此列表。

像这样:

Modules activated:
module1 module2 module3 
module4 mod5    mod6 
mod7    module8 module9

理想情况下,列withs将调整为列中最大模块的宽度(请参阅mod7);并根据当前终端的宽度调整列数。

现在,我发现了一些似乎这样做的unix实用程序,比如column,但是我无法使用我的set。

你有一些技巧可以让我这样做吗?

修改

下面选择了答案,我终于在Makefile中破解了这个命令:

@printf '%s\n' $(MODULES) | sort | column

4 个答案:

答案 0 :(得分:5)

printf '%-12s%-12s%s\n' $modules

这会占用变量的内容,因为占位符在格式字符串中出现的次数会重复,直到消耗掉所有内容为止。

column实用程序会自动为您生成列:

column <<< "$(printf '%s\n' $module)"

这是第一列。如果你想要排在第一位:

column -x <<< "$(printf '%s\n' $module)"

答案 1 :(得分:2)

使用this question的答案,尝试以下方法:

echo "Modules activated:"
for item in $modules; do 
    printf "%-8s\n" "${item}"
done | column

如果要转置输出,可能会向列命令添加-x

就列数而言,这应该是终端敏感的。

答案 2 :(得分:1)

columnfold对齐:

echo $modules | column -t | fold | column -t

答案 3 :(得分:0)

您可以使用折叠和制表符来进行粗略格式化:

echo "module1 module2 module3 module4 mod5 mod6 mod7 module8 module9" | sed 's/ /\t/g' | fold -s -18module1 module2 
module3 module4 
mod5    mod6    
mod7    module8 
module9

但如果某些模块名长度超过8个字符,并且有些模块名称更短,则无法正常工作。