文字列の特定部分の変数のエコー

文字列の特定部分の変数のエコー

良い命令を出そうとします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

やるべきことは、コミットが完了した場合です。を選択すると、自分のユーザー名がターコイズで印刷され、そうでなければ共同編集者のユーザー名が太い青で印刷されます。しかしそうではありません。

私はここで何が間違っているのか知っている人がいるのだろうか?私はこれがすでに文字列である環境に変数を印刷することに関連していると思いますが、問題を解決する方法がわかりません。助けてくれてありがとう!

答え1

Gitの型パラメータにシェルスクリプトを入れようとしています。もちろんこれはうまくいきません。1

  • 実際には、シェルスクリプトを許可するいくつかのGitパラメータがあります。git filter-branch;ただし、該当するマニュアルページに明示的に指定されています。

達成したいことは、実際にGitを通るのではなく、外部フィルタを使用して名前を一致させ、色を区別することによって行うことができます。ANSIエスケープシーケンス

たとえば、作者名が「ジョミン「その場合は、名前と山の括弧をターコイズで強調表示します。そうでない場合は、名前と山の括弧を太い青で強調表示します。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(少しハッキー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

強調表示された出力(2つのフィルタのうちの1つ):

次の場合、出力形式を変更してもgit logこれらのフィルタコマンドは引き続き機能します。

  • 作成者の名前は常に含まれています< >
  • 1 行に 1 人以上の作成者を表示できません。
  • その他は含まれていません< >

要求された操作を実行するもう1つの方法は、2つのgit log異なる呼び出しを実行し、結果をマージしてからタイムスタンプでソートすることです。しかし、トリッキーな部分は、両方の呼び出しの出力が重複する出力を提供しないようにすることです。 (そうすると、別のエスケープシーケンスで表示されるので使用できません。)--author--prettygit loguniq


脚注

  • 1実際に引用不足のためにif [ ! %an = "my own user name" ] ... USER=この行ではすでに実行されています。%an比較は文字通り行われます。シェルには特別な意味はありません。)USER="%C(cyan)<%an>"これは、コマンドを呼び出す前に効果的に行われますgit log
  • 2また、自分の名前は水色で、他の人の名前は太い青で強調したいのですが、元のコードではその逆を試みます。if(著者名)いいえ(私のユーザー名)、ターコイズで強調表示され、そうでない場合は太い青で強調表示されます。私はあなたの説明を支持します。
  • 3 \xGNU sed 拡張、GNU以外のシステムで使用している場合は、マイルが異なる場合があります。

答え2

[ ! %an = "my own user name" ]%anユーザー名や他のユーザー名と同じではないため、常にtrueです。%anbashに関する限り、これは単にリテラル文字列なので、同じであるという唯一のものです。特別な意味(「著者名」)だけがあります。子供から

おそらくあなたが要求することを行う賢い方法があります。しかし、ATMマシンは思い出されません。私はあなたがしたいようにbashとgitを混ぜてそれをすることはできないと思います。そのような解決策があれば、おそらく非常に扱いにくいでしょう。デフォルトでは、bashレベルとgitレベルの間をトランポリンする必要があり、gitはすべてのコミットを繰り返すが、どういうわけかbashに作成者の名前を伝える必要があります。bashレベルがgitにどの色を使うのかを知らせるようにコミットしてください。

その場合できる完了したら、これがbashとgitの混合ではなく、純粋なgitソリューションになる可能性が高いと思います。

答え3

良い練習のために:

変数はデータを保持します。関数はコードを保存します。変数にコードを入れないでください!

バラよりウィキウールフリンジ

関連情報