Colors

當文本著色時,“column”的輸出未對齊

  • March 6, 2017

我有一個 tcsh 腳本中的句子列表,它們由 ‘\n’ 分隔,並且裡面可能有空格。我想以 ls 的風格展示它們,所以我做了“echo $list| column”。當沒有使用顏色時它工作正常。結果如下 所需的格式,當沒有使用顏色時。

然後我需要突出顯示每次出現的一些更改的項目(最新的 3 個選項)。我在要突出顯示的項目周圍添加顏色序列(\e[33m 和 \e[0m),然後仍然將它們放入 $ list. When I show them with “echo $ 列表 | 列”,顏色還可以,但文字錯位如下圖。添加顏色後未對齊

注意,我試過如果不使用 ‘| column’,字元串在一列中正確顯示,即使不是我想要的樣式。

這個問題有什麼解決辦法嗎?

順便說一句,我做了一些搜尋,這似乎是列的錯誤。專欄有維護者嗎?我應該在哪里報告問題?

注意:在發布之前,我已經閱讀了列命令和顏色轉義碼的問題。他的格式是固定的,而我的彩色項目是動態的。所以簡單地使用 printf 或在列後添加顏色是行不通的

不理解為輸出著色的轉義序列column,它僅通過計算輸入中的“可列印字元”來操作。例如,將文本變為綠色 ( ^[[0;32m) 的序列包含六個可列印字元,並且將按此計算。

如果您想查看column確定列寬時真正看到的內容,請嘗試以下操作:

ls --color=always / | tr -dc '\n -~' | column -s '\n'

如果您不支持此選項,請替換ls --color=always /為任何具有彩色輸出的命令。ls

無法說服column忽略這些轉義序列,但您可以在之後添加顏色。

假設您有一個to-list如下所示的文件:

1: avifsc01
2: avifsh01_bg4dtva0f
3: avifsh01_bg5dtvz1f
4: bg2ctqz1
5: bg2dtva0
6: bg3cda0
7: bg3cda1
8: bg3cdpa0
9: bg3z1
10: bg4cdpa0f
11: bg4cdpz1f
12: bg4cdz1f
13: bg4cta0f
14: bg4ctpa0f
15: bg4ctpz1f
16: bg4ctz1f
17: bg4dtva0f
18: bg4dtvz1f
19: bg5ctpz1f
20: bg5ctz1f
21: bg5dtvz1f
22: bg6ctz1f
23: bgpk01
24: dsc
25: test
26: vpp01
27: vrdlib01

然後你做:

list=$(cat to-list)

假設您知道要為一些特定條目著色:

to_color='bg3cda0 bg4dtva0f bg6ctz1f'

column您可以在著色之前格式化列表:

printf '%s\n' "${list}"                         \
| column -s '\n'                                \
| sed "s@$( (printf '%s\\|' ${to_color}; echo)  \
           | sed 's@^@\\([0-9][0-9]*: \\(@'    \
           | sed 's@\\|$@\\)\\)@'              \
      )@$(printf '\033')[33m\1$(printf '\033')[0m@g"

只要您有某種方法可以生成這兩個變數(${list}${to_color}),就可以動態生成這些條目。

結果:

彩色輸出

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