You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Bash的column命令尊重带引号的文本(文件名)

如何让Bash的column命令尊重带引号的文本(文件名)

我太懂这个烦恼了!默认的column -t命令会把所有空格都当成列分隔符,哪怕是引号里用来分隔文件名的空格也不放过,直接把带空格的文件名拆得乱七八糟,完全达不到我们想要的整齐排版效果。

先看看你的原始文件内容:

cat testfile

输出:

123     "file name with spaces" tail
51    "longfilenamehere with spaces" head
Monday "shortname" hands
Blue "very longfilename_______________here with spaces" feet

用默认的column -t处理后,结果简直没法看:

cat testfile | column -t

输出:

123     "file              name                             with     spaces"  tail
51      "longfilenamehere  with                             spaces"           head
Monday  "shortname"                                                           hands
Blue    "very              longfilename_______________here  with     spaces"  feet

而我们真正想要的排版应该是这样的:

123     "file name with spaces"                            tail
51      "longfilenamehere with spaces"                     head
Monday  "shortname"                                        hands
Blue    "very longfilename_______________here with spaces" feet

那怎么解决这个问题呢?核心思路是先把引号内的空格临时替换成其他字符,让column命令把引号里的内容当成一个整体,处理完再把空格换回来。这里给你一个能用的命令:

awk -F'"' '{for(i=2;i<=NF;i+=2) gsub(/ /, "__SPACE__", $i)} 1' testfile | column -t | sed 's/__SPACE__/ /g'

我来拆解一下这个命令的逻辑:

  • awk -F'"':把双引号设为字段分隔符,这样每一行里被引号包裹的内容会被单独识别成一个字段
  • for(i=2;i<=NF;i+=2):遍历所有被引号包裹的字段(因为分隔符是引号,所以偶数位置的字段就是引号里的内容)
  • gsub(/ /, "__SPACE__", $i):把这些字段里的空格替换成__SPACE__,这样column就不会把它们当成列分隔符了
  • 1:这是awk的小技巧,意思是打印处理后的整行内容
  • 接着用column -t进行正常的列对齐排版
  • 最后用sed 's/__SPACE__/ /g'把临时替换的字符换回空格,恢复原来的文件名

运行这个命令后,就能得到你想要的整齐排版效果啦!

备注:内容来源于stack exchange,提问作者johnmuir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 13:04:31