Text-Processing

對擴展命令的理解

  • April 15, 2022

我無法完全理解命令的-t參數是如何expand工作的。以下是其手冊頁的摘錄。

NAME
      expand - convert tabs to spaces
...

-t, --tabs=N
      have tabs N characters apart, not 8

製表符 N 個字元分開是什麼意思?我做了一些測試。

root@u2004:~# printf "a\tb\n"
a   b
root@u2004:~# printf "a\tb\n" | od -a
0000000   a  ht   b  nl
0000004
root@u2004:~# printf "a\tb\n" | expand | od -a
0000000   a  sp  sp  sp  sp  sp  sp  sp   b  nl
0000012
root@u2004:~# printf "a\tb\n" | expand -t 4 | od -a
0000000   a  sp  sp  sp   b  nl
0000006
root@u2004:~# printf "a\tb\n" | expand -t 5 | od -a
0000000   a  sp  sp  sp  sp   b  nl
0000007
root@u2004:~#

如您所見,當我通過時-t 4,製表符被替換為 3 個空格。所以,實際上,“製表符間隔 4 個字元”只是意味著製表符被替換為 3 個空格?我無法理解。順便說一句,我不是以英語為母語的人,這可能是一個與英語相關的問題。

它指的是製表,製表符跳轉到的位置。使用-t 4,每四個字元有一個製表位。

製表符不會插入固定數量的空格,而是跳轉到下一個這樣的位置,因此添加的空格量取決於製表符之前的文本長度。例如:

$ printf "1\tx\n" | expand -t 4 | od -a
0000000    1  sp  sp  sp   x  nl                                        
0000006
$ printf "123\tx\n" | expand -t 4 | od -a
0000000    1   2   3  sp   x  nl                                        
0000006

當然,重點是讓列對齊:

$ printf "123\tx\n1\tx\n" |expand -t4
123 x
1   x

因此,為了嘗試在視覺上表示它,製表位的位置是這樣的,^顯示停止:

123412341234...
^   ^   ^

(當然你不能從一開始就使用標籤,所以第一個並不真正存在。)

但是,如果一個欄位比製表位距離長,那會變得一團糟,但是expand將列位置列表作為替代,例如,它有一個四寬的列和一個八寬的列:

$ printf "%b\n" 'A\t1234567\thello' 'B\t987\tworld' |expand  -t4,12
A   1234567 hello
B   987     world

在那裡,停靠點是這樣的:

         11111111112
012345678901234567890...
A   1234567 hello
B   987     world
   ^       ^

我在那裡從零開始編號,以便位置與命令行上給出的數字相匹配。

引用自:https://unix.stackexchange.com/questions/699157