Text-Processing

如何限制 git branch –format 字元串長度

  • January 17, 2022

我有這個~/.gitconfig別名:

b = "!r() { count=10; git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:bold green)%(committerdate:relative)|%(color:yellow)%(refname:short)|%(color:red)%(objectname:short)%(color:reset)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=${count:=10} | column -c 10 -ts '|'; }; r"

我對這個函式的問題是它根據最長的行格式化字元串,即如果我有一個包含以下值的表(這不是來自的輸出git branch --format,只是一個說明column行為的範例):

a, b, c
x, yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, z

然後它看起來像

a, b                                                  , c
x, yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, z

這是一個很好的行為column,但是我想修剪字元串長度,因此,例如,沒有一列會超過 4:

a, b   , c
x, yyyy, z

我設法添加了一個管道awk來做類似的事情(使用 25 個字元):

b = "!r() { count=10; git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:bold green)%(committerdate:relative)|%(color:yellow)%(refname:short)|%(color:red)%(objectname:short)%(color:reset)|%(color: blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=${count:=10} | column -c 10 -ts '|' | awk '{for(i=1;i<NF;i++){$i=substr($i,1,25)}; print $0}'; }; r"

但它把桌子弄亂了:(

*在目前分支的開頭也有不正常的行為。

我怎樣才能解決這個問題?

  • 我嘗試安裝一個較新的版本,column該版本應該有一個-c控制寬度的選項,但我不能:((從這裡下載然後嘗試./configure && make install。沒有按預期工作)。
  • 試圖用\換行符格式化函式 - 沒有用。函式必須gitconfig看起來那麼難看嗎?
$ git --version
git version 2.34.1

如果您無法訪問column了解輸出寬度限制的實現,一種方法是在awk. 但是,實現邏輯 - 雖然直截了當 - 會增加gitconfig函式的長度:

awk -F'|' -v maxw=4 '{for (i=1;i<=NF;i++) {l=length($i); if (l>maxw) l=maxw; if (l>mw[i]) mw[i]=l; lines[NR]=$0}}
   END{for (j=1;j<=NR;j++) {n=split(lines[j],f,/\|/); for(i=1;i<=n;i++) {printf("%*s%s",mw[i],substr(f[i],1,maxw),i==n?ORS:OFS)}}}'

如您所見,該awk程序將輸入拆分為|(這是您所說的git branch命令的實際輸出)。

  • 對於每一行,它遍歷所有欄位並將mw每列的最大欄位寬度儲存在數組中,但限制為變數中指定的最大寬度maxw
  • 然後它將每行的“原始”內容(包括原始欄位分隔符)儲存在緩衝數組lines中。
  • 在輸入結束時,它遍歷lines緩衝區並再次將行拆分|為數組f。對於 的每個條目f,它通過 列印最多maxw欄位的字元printf,其中所需的欄位寬度取自mw相應列的數組。

對於您的範例(但假設實際|-separation 而不是,您顯示的),輸出將是:

a    b c
x yyyy z

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