我已经阅读了一些有关 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
)可以显示具有不同制表符间隔的文本。
进一步阅读
- unexpand - 将空格转换为制表符(POSIX)
- tabs-设置终端标签(POSIX)
- 展开 - 将制表符转换为空格(POSIX)