unexpand 命令如何真正起作用?

seb*_*elk 3 coreutils tabulation

我已经阅读了一些关于 unexpand 的解释,但要么我不明白,要么没有按预期工作。

让我们考虑以下示例:

[root@hope log]# echo "A12345678B" | tr '[1-8]' ' ' | unexpand -a
A        B
[root@hope log]# echo "A12345678B" | tr '[1-8]' ' ' | unexpand -a | od -ta
0000000   A  ht  sp   B  nl
0000005
[root@hope log]# echo "A12345678B12345678C" | tr '[1-8]' ' ' | unexpand -a | od -ta
0000000   A  ht  sp   B  ht  sp  sp   C  nl
0000011
[root@hope log]# echo "12345678" | tr '[1-8]' ' ' | unexpand -a | od -ta
0000000  ht  nl
0000002
Run Code Online (Sandbox Code Playgroud)

我看到它用一个制表符替换了 8 个空格,但是每次出现一些非空白字符时,它都会再追加一个空格。

使用 bash-4.3.42-3.fc23.x86_64 和 coreutils-8.24-6.fc23.x86_64

请你能解释一下这种行为吗?

Tho*_*key 7

unexpand程序不是简单地用制表符替换 8 个空格。它替换行中的空格和制表符,假设制表符会导致用于显示该行的终端移动到下一个制表位。通常这些间隔为 8 个车位,但对于大多数终端而言,该间隔是可以更改的(并且每个停靠站的间隔都可以更改)。

第一个示例字符串"A12345678B"用空格替换数字 1-8。结果中的前 8 个字符是一个制表符间隔。这会在第一个制表位处留下一个空格(8 所在的位置)。该unexpand程序不会添加一个空格; unexpand用制表符替换 1-7 中的空格后剩下的。

人们会使用unexpand制表符将主要包含空格(或空格和制表符的混合)的文件转换为一致的格式。出于同样的原因(缩进),多行以空格开头的文件可能比使用制表符的文件大得多。此外,它用于转换文件以使用不同的制表位,例如,对于列与一组制表位对齐的表格,使其更宽或更窄。

不同制表符间隔之间的转换可能是这样完成的:

expand -t 1,6,11,16,21 foo | unexpand -t 1,9,17,25,33 >bar
Run Code Online (Sandbox Code Playgroud)

除了终端中设置的制表位之外,一些程序(例如vi)可以显示具有不同制表符间隔的文本。

进一步阅读