awkでの2つの区切り記号の問題

awkでの2つの区切り記号の問題

ブランチ名と説明を表示するgitエイリアスを作成しようとしています。ブランチの説明を取得する特別なコマンドやスイッチはありません。構成で一時停止する必要があります。しかし、すべてのポイントのリストとその説明(ある場合)を取得したいと思います。

次のように、一種の「生データ」を取得できます。

$ git config -l
core.symlinks=false
core.autocrlf=false
core.fscache=true
color.diff=auto

だから私が興味のある項目は次のとおりです。

branch.featureA.description=Mail templates
branch.featureB.description=Something else

これをパイプで接続することで、次のようになります。git config -l | grep description | grep \^branch.私が望む出力の場合は、次のようにします。

featureA Mail templates
featureB Something else

これを表現する1つの方法は、ピリオドの後の2番目の「列」と等号の後の最初の「列」が必要なことです。または削除し.branchname.たいです.description=。最善の方法はよくわかりませんが、awk文字列を列として扱ってみました。さまざまな区切り記号を使用して、必要な部分を得ることができます。

$ git config -l | grep description | grep \^branch. | awk -F '.' '{ print $2 }'
featureA
featureB

$ git config -l | grep description | grep \^branch. | awk -F '=' '{ print $2 }'
Mail Templates
Something else

しかし、2つの区切り文字を組み合わせようとするとうまくいかないようです。

$ git config -l | grep description | grep \^branch. | awk -F '.=' '{ print $2 }'
Mail templates
Something else

文字列から目的のデータをどのように解析できますか?

ベストアンサー1

私はsedこれを使うことができます:

sed -n '/^branch/{ s/[^.]*\.//; s/\.[^=]*=/ /p; }'

これは、文字列で始まるすべての行とbranchすべての行をキャプチャします。

  1. 最初のポイントより前のすべてのアイテムを削除してから
  2. =最初の残りのポイントから、最初の文字を含むすべての項目を空白に置き換えます。

次に、修正された行を印刷します。他の行は削除されます。


そしてawk

awk -F '=' '/^branch/ { split($1, a, "."); print a[2], $2 }'

これは入力を別々のものとして扱い、最初の=部分を点に分割します。その後、ドットで区切られた2番目の文字列も印刷されます=

行に複数が含まれていると、この操作は失敗します=(2番目のビット以降のビットは=失われます)。

おすすめ記事