来自 coreutils 的手册pr
:
‘-e[in-tabchar[in-tabwidth]]’ ‘--expand-tabs[=in-tabchar[in-tabwidth]]’
将制表符扩展到输入上的空格。可选参数 in-tabchar 是输入制表符(默认为 TAB 字符)。第二个可选参数 in-tabwidth 是输入制表符的宽度(默认为 8)。
是否意味着用多个空格-e[in-tabchar[in-tabwidth]]
替换每个?in-tabchar
in-tabwidth
在下面的两个示例中,为什么a
、b
和c
之间被一个空格分隔,而第一个示例中1
和被三个空格分隔,而第二个示例中 和 被两个空格分隔?3
谢谢。
$ printf "a:b:c\n1::3\n" | pr -t -e:2
a b c
1 3
$ printf "a:b:c\n1::3\n" | pr -t -e:1
a b c
1 3
答案1
pr -e
与命令执行相同的工作expand
。它以与终端模拟器通常类似的方式扩展选项卡。 TAB 是一个控制字符,终端将其理解为将光标移动到下一个制表位,它用于表格格式和对齐。
在大多数终端上,默认情况下,制表位每 8 列一次。因此,向它们发送 TAB 与发送 1 到 8 之间的多个空格具有相同的效果,具体取决于当前光标位置:
$ printf '%b\n' 'a\tb' 'abcde\tg'
a b
abcde g
第一个选项卡将光标向右移动 7 列,第二个选项卡向右移动 3 列。
pr -e
将根据需要用尽可能多的空格替换它们\t
以达到相同的效果:
$ printf 'abcde\tg\n' | sed l
abcde\tg$
abcde g
$ printf 'abcde\tg\n' | pr -te | sed l
abcde g$
abcde g
请注意,GNUpr
具有与 GNU 相同的限制,expand
即它假定所有字符均由一个字节组成并占用一列来显示。