在 Linux 中,有没有办法在分隔符上对齐文本?

jny*_*len 3 linux shell sed text-alignment

我有一个基本上运行的脚本tmux ls

session1: 3 windows (created Fri Sep 20 13:16:13 2013) [157x56]
stuff: 3 windows (created Fri Sep 20 13:25:21 2013) [157x56]
asdf: 2 windows (created Sun Sep 29 23:06:33 2013) [77x17] (attached)
website: 1 windows (created Tue Sep 24 17:22:14 2013) [157x26]
Run Code Online (Sandbox Code Playgroud)

我希望该脚本的输出在冒号处对齐,以提高可读性。我知道如何使用,column -t但它并不能完全满足我的要求(请注意双倍间距,并且冒号实际上并未对齐):

session1:  3  windows  (created  Fri  Sep  20  13:16:13  2013)  [157x56]
stuff:     3  windows  (created  Fri  Sep  20  13:25:21  2013)  [157x56]
asdf:      2  windows  (created  Sun  Sep  29  23:06:33  2013)  [77x17]   (attached)
website:   1  windows  (created  Tue  Sep  24  17:22:14  2013)  [157x26]
Run Code Online (Sandbox Code Playgroud)

这是我真正想要的输出:

session1 : 3 windows (created Fri Sep 20 13:16:13 2013) [157x56]
stuff    : 3 windows (created Fri Sep 20 13:25:21 2013) [157x56]
asdf     : 2 windows (created Sun Sep 29 23:06:33 2013) [77x17] (attached)
website  : 1 windows (created Tue Sep 24 17:22:14 2013) [157x26]
Run Code Online (Sandbox Code Playgroud)

在 Linux shell 中实现此目的最简单/最好的方法是什么?


编辑:如果您想测试您的答案,可以使用curl -s nylen.tv/tmux.txt代替tmux ls

Chr*_*our 5

GNU sed可以指定匹配的出现位置,以便s/ +/ /g在整个文件中使用单空格s/ +/ /2g,但在每行的第二个匹配之后:

$ column -t file | sed -re 's/: ( +)/\1: /' -e 's/ +/ /2g'
session1 : 3 windows (created Fri Sep 20 13:16:13 2013) [157x56]
stuff    : 3 windows (created Fri Sep 20 13:25:21 2013) [157x56]
asdf     : 2 windows (created Sun Sep 29 23:06:33 2013) [77x17] (attached)
website  : 1 windows (created Tue Sep 24 17:22:14 2013) [157x26]
Run Code Online (Sandbox Code Playgroud)

为了排序第一列间距,我们使用s/: ( +)/\1: /匹配所有空格,:并将 n-1 个空格存储在第一个捕获组中。然后,我们将 和 所有空格替换:为 n-1 个空格,后跟 a,:后跟一个空格(再次形成 n 个总空格)