1

新しいリリース ( https://stackoverflow.com/a/5151123/520162 )の変更ログの作成を容易にするために、特定のパターンを使用して Git でコミット メッセージを実行しています。

私の変更ログに取り込む必要があるすべての変更にはCHGNEWまたはのプレフィックスが付けられFIXます。

変更ログの生成に関しては、リビジョンごとに次のコマンドを使用して解析するリビジョンを出力します。

git show --quiet --date=short --pretty=format:"%cd %an %s%n%n%w(100,21,21)%b%n" $CURRENTREVISION

サブジェクト ( %s) は、変更のサブジェクトを保持します。

次に、SED を使用して生成された出力を変更し、変更ログ ファイルのニーズに適合させます。

ここで、件名にCHGNEWまたはが複数回出現することがありFIXます。件名の私の出力は次のようになります。

DATE NAME FIX first change NEW second change CHG third change

キーワードの最初の出現以外のすべてに改行を付けて、各CHG,NEWまたはが改行をFIX開始するようにしたいと思います。

DATE NAME FIX first change
          NEW second change
          CHG third change

これを達成するには、SED に何を伝えなければなりませんか?

4

4 に答える 4

2

sedこれには最適なツールではありません

それはこのawkようになります。

awk '{n=0; for (i=1; i<=NF; i++) {if ($i ~ /(NEW|FIX|CHG)/) {$i=(n++?"\n          ":"")$i}}}7'
  • n=0(再)フラグを立てる
  • for (i=1; i<=NF; i++)行のすべてのフィールドをループします
  • if ($i ~ /(NEW|FIX|CHG)/)フィールドがマーカーの 1 つである場合
    • $i=(n++?"\n ":"")$i適切な先行スペースを追加してフィールドを更新します (または何も追加しません)。
  • 7現在の行を出力する true-y パターン。
于 2014-12-08T14:44:04.697 に答える
1
sed '/^DATE NAME/ {
:cycle
   s/\(.\{1,\}\) \(FIX .*\)/\1\
\2/g
   t cycle
   s/\(.\{1,\}\) \(NEW .*\)/\1\
\2/g
   t cycle
   s/\(.\{1,\}\) \(CHG .*\)/\1\
\2/g
   t cycle

   s/\n/&          /g
   s/\n */ /
   }' YourFile

posixバージョン(--posixGNU sed上)のようなもの。

シンプルな

   s/\(.\{1,\}\) \(\(CHG|FIX|NEW\) .*\)/\1\
\2/g
   t cycle

s///最初の 3を GNU sed に置き換えて、|

フィルターとして最初のものを少し確保し/^DATA NAME/ますが、この種の行のみが処理される場合、これは必要ありません (および関連付けられています{ })

于 2014-12-08T14:58:39.767 に答える
0

sedこの作業に適したツールとは思えません。で保持される状態sedは非常に限られており、目標にはカウンターが必要ですが、これは ではかなり困難ですsed。後でコードを維持することに満足しないと思います。

代わりに、多分Perlそれのための素晴らしいツールだと思います。

このようなもの:

while(<STDIN>){
    my @matches = m/^(.*?)((?:FIX|NEW|CHG).*?)*$/;
    my $date_name = unshift @matches; # only FIX, NEW, CHG remains now
    print $date_name, unshift @matches;
    while (@matches) { print "\t\t", unshift @matches; }
}

元のデータをパイプし、シェルでファイルにリダイレクトします。

于 2014-12-08T14:35:42.160 に答える