Variable

從字元串的特定部分中的變數回顯

  • September 22, 2019

我正在嘗試為擁有一個漂亮的git log. 說我有以下內容:

git log --color --pretty=format:"%C(cyan)<%an>" --abbrev-commit

我想做的是製作一個變數,該變數%an根據輸出字元串採用並決定它將是什麼顏色。

到目前為止,我有

USER=$(if [ ! %an = "my own user name" ]
   then
       echo "%C(cyan)<%an>"
   else
       echo %C(bold blue)<%an>
   fi)

因此,我將變數放入 git log 中,這樣我就有了

git log --color --pretty=format:"$USER" --abbrev-commit

應該這樣做,如果完成了送出,它將以青色列印我的使用者名;否則,它將以粗體藍色列印協作者的使用者名。然而,事實並非如此。

我只是想知道是否有人知道我在這裡做錯了什麼?我懷疑這與將變數列印到已經是字元串的環境中有關,但我不知道如何修復它。任何幫助表示讚賞!

您正在嘗試將 shell 腳本放入 Git 的格式化參數中。當然,它不會起作用。1

  • 有一些 Git 參數實際上接受 shell 腳本,比如git filter-branch; 但它們將在相應的手冊頁中明確指定。

您嘗試完成的工作實際上可以完成,而不是通過 Git,而是通過使用外部過濾器來匹配名稱,並使用ANSI 轉義序列用顏色標記它們。

例如,當作者姓名與“ Joe Average ”匹配時,以青色突出顯示姓名和尖括號;否則,以粗體藍色突出顯示名稱和尖括號。2在這兩種情況下保持文本的其他部分不變……

通過使用 Perl 5 作為過濾器來實現:

git log "--pretty=tformat:%h <%an> %s" | perl -n -e '
chomp;
if(/^(.*)<([^>]*)>(.*)$/) {
   if ($2 eq "Joe Average") {
       print $1."\e[36m<".$2.">\e[39m".$3."\n";
   } else {
       print $1."\e[1m\e[34m<".$2.">\e[39m\e[0m$3\n";
   }
} else {
   print $_."\n";
}'

通過sed用作過濾器來實現(有點 hacky 3)……

git log "--pretty=tformat:%h <%an> %s" | sed '
s/<\(Joe Average\)>/\x1B[36m<\1>\x1B[39m/g;
t matched;
s/<\([^>]*\)>/\x1B[1m\x1B[34m<\1>\x1B[39m\x1B[0m/g;
:matched'

來自測試儲存庫的正常輸出(無過濾器):

$ git log "--pretty=tformat:%h <%an> %s"
e7f3209 <Joe Average> improving portability
e3ebe74 <Jim Sixpack> adding first working prototype

突出顯示的輸出(通過任一過濾器):

請注意,即使您更改了git log輸出格式,這些過濾器命令仍然有效,前提是:

  • 作者姓名始終包含在< >.
  • 一行不超過一個作者。
  • 沒有其他東西被包含在< >.

執行您所要求的另一種方法是使用不同的and進行兩次不同的git log呼叫,將結果合併在一起,並按時間戳對它們進行排序;但棘手的部分是確保兩個呼叫的輸出不會產生重疊輸出。(你不能使用,因為這樣做會用不同的轉義序列標記它們)--author``--pretty``git log``uniq


腳註

  • 1實際上,由於沒有引用,你的if [ ! %an = "my own user name" ] ... 已經在該USER=執行(%an將按字面比較——它在 shell 中沒有特殊含義);USER="%C(cyan)<%an>"在您甚至可以呼叫git log命令之前使其有效。
  • 2另外,你說你想用青色突出你自己的名字,而其他人用藍色加粗;但是您的原始程式碼實際上嘗試了相反的操作:如果(作者姓名)不是(我自己的使用者名),則以青色突出顯示,否則以粗體藍色突出顯示。我堅持你的描述。
  • 3 \xGNU sed 的擴展,如果您在非 GNU 系統上使用它,您的里程可能會有所不同。

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