如何让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
相关产品推荐
相关产品推荐

