私はこれがあります。ほぼ私がしたいことをしなさい
git show-branch --current $SHA1 \
| sed --quiet --regexp-extended \
's/^.*\* \[[a-z]+\/(B-[0-9]+)-([a-z0-9-]+)\].*/\1 \2/p' \
| sed --quiet 2p
そして出力
B-47120 java-11-take2
git show-branch
これを出力しています
! [62cba3e2b3ba8e1115bceba0179fea6c569d9274] B-48141 remove env prefix
* [ccushing/B-47120-java-11-take2] B-48141 remove env prefix
--
* [ccushing/B-47120-java-11-take2] B-48141 remove env prefix
+* [62cba3e2b3ba8e1115bceba0179fea6c569d9274] B-48141 remove env prefix
私が望む出力は
B-47120 java 11 take2
2番目のキャプチャグループの'sを置き換えていますが、2番目の部分のonlyもキャプチャする必要があるため、置き換える方法が見つかりません-
。-
私はここにいるWindows用の子、付属のツールでのみ可能です。これを行うより多くのプログラムがありますが(Perlを使用することもできます)。可能であれば答えを見たいですsed
。
修正する
明らかに明らかではないからです。パターンは本質的にusername/ticketid-description
(パターンを得るために必要なものを除くgit show-branch
)です。
- ユーザー名は常にアルファでなければなりません。
- Ticketidの形式は常に
B-\d+
- 説明は
\2
空白-
に変換する必要があります。
prepare-commit-msg
git
プログラム的にこれをフック用のgitヘッダーラインに変換したいと思います。
答え1
以下を試してください。
... |sed -nE '/^[[:blank:]*]+\[[^/]*\/(B-[0-9]+)-([^]]*)\].*/{
s//\1 \2/; :a s/(B-[0-9]+ [^-]*)-(.*)/\1 \2/;ta; p; }'
ヒント:
[^X]*
:すべての文字と一致しますが、文字は一致しませんX
(\n
ewlineを除く)。[^X]*X
:すべての文字と一致しますが、文字の後に文字が続く場合は一致しませんX
(ewline例外も含めます)。\n
X
(...)
\1
:最初、2番目などの逆参照のグループ一致をキャプチャします(最大逆参照数\2
までのみ設定できます)。\9
:label s/find/replace/; t label
:label
成功した置換にジャンプし、コマンドを繰り返します。
またはより短いもの(入力形式によって異なります):
... |sed -nE '/^[^/]*\/([^]]*)\].*/{
s//\1/; :a s/(B-[0-9]+)(.*)-([^-]*)$/\1\2 \3/;ta; p; }'
答え2
私は以下のいくつかを想定して以下を提案します(これらの仮定が間違っているかどうかを教えてください)。
# select the line with the slash character '/'
# replace the first '-' for other char not possible to be in the string, example '@'
# replace all '-' for spaces
# replace '@' for '-'
# capture everything between the '/' an the ']', remove everything else
$ sed -n -e '\:/:{s:-:@:;s:-: :g;s:@:-:;s:^.*/\([^]]*\).*:\1:p;q}'
B-47120 java 11 take2
\:/:
スラッシュを含む行を選択してください/
。
* [ccushing/B-47120-java-11-take2] B-48141 remove env prefix
s:-:@:
代替、貪欲ではないので、-
最初@
のもののみ可能です。
* [ccushing/B@47120-java-11-take2] B-48141 remove env prefix
s:-: :g
空白の代わりに-
貪欲が多い。
* [ccushing/B@47120 java 11 take2] B 48141 remove env prefix
s:@:-:
@
代替-
* [ccushing/B-47120 java 11 take2] B 48141 remove env prefix
s:^.*/\([^]]*\).*:\1:p;q
/
との間にある内容をキャプチャし、]
残りはすべて削除して印刷して終了します。
B-47120 java 11 take2
答え3
GNU sedの設定では、次のような出力を得ることができます。
注:私は正規表現を変更せず、一部のみ調整しました。 4番目のゲームが必要だと仮定すると、次のよう{2}
に変更します。{4}
sed --quiet --regexp-extended '
s/^.*\* \[[a-z]+\/(B-[0-9]+)-([a-z0-9-]+)\].*/\1 \2/;T;G
s/\n{2}$//;Ta
s/-/ /2gp;q
:a;z;H
' file