나는 다음과 같은 ~/.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
답변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