unexpand命令到底是如何工作的?

unexpand命令到底是如何工作的?

我已经阅读了一些有关 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

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

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

请您解释一下这种行为吗?

答案1

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

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

进一步阅读

相关内容