Shell实现将第2个空格后内容视为单列的列格式化解决方案
解决方法
你的问题出在column -t会把所有空格都当作列分隔符,导致带空格的扩展名称被拆成了多列。既然文件路径本身没有空格,我们可以用awk来精准拆分,把第一个空格前的路径作为第一列,剩下的所有内容(不管有多少空格)合并成第二列,而且这个方案是通用的,不会局限于固定列数。
直接用这个命令就能搞定:
for f in */*/manifest.json; do echo -n "$f "; jq -r '.name + " " + .version' "$f"; done | awk '{first=$1; $1=""; print first "\t" substr($0,2)}'
如果想要表格对齐更美观,可以再结合column工具,指定制表符作为分隔符:
for f in */*/manifest.json; do echo -n "$f "; jq -r '.name + " " + .version' "$f"; done | awk '{first=$1; $1=""; print first "\t" substr($0,2)}' | column -t -s $'\t'
原理说明
awk的逻辑很简单:- 先把第一个字段(无空格的文件路径)存到变量
first里; - 清空第一个字段,这样剩下的内容就是原行去掉路径后的部分(前面会多一个空格);
- 用制表符分隔路径和
substr($0,2)(去掉开头多余空格后的剩余内容),确保后面所有带空格的内容都被合并成一列。
- 先把第一个字段(无空格的文件路径)存到变量
处理后的输出会是整齐的两列:
cjpalhdlnbpafiamejdnhcphjbkeiagm/1.14.22_0/manifest.json uBlock Origin 1.14.22 dbepggeogbaibhgnhhndojpepiihcmeb/1.62.4_0/manifest.json Vimium 1.62.4 dffhipnliikkblkhpjapbecpmoilcama/0.3_0/manifest.json Swap My Cookies 0.3 gcbommkclmclpchllfjekcdonpmejbdp/2017.12.6_0/manifest.json __MSG_about_ext_name__ 2017.12.6 gdbofhhdmcladcmmfjolgndfkpobecpg/4.19_0/manifest.json Don't track me Google 4.19 pkehgijcmpdhfbdbbnkijodmdjhbjlgp/2017.11.20_0/manifest.json __MSG_name__ 2017.11.20
这个方案完全符合你的要求:既实现了两列的正确拆分,又不会只适配固定列数——哪怕扩展名称有更多空格(比如叫My Awesome Extension),也能完整合并到第二列里。
内容的提问来源于stack exchange,提问作者Mark Howard
相关产品推荐
相关产品推荐

