sed はキャプチャグループの文字を置き換えます。

sed はキャプチャグループの文字を置き換えます。

私はこれがあります。ほぼ私がしたいことをしなさい

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\newlineを除く)。
  • [^X]*X:すべての文字と一致しますが、文字の後に文字が続く場合は一致しませんX(ewline例外も含めます)。\nX
  • (...)\1:最初、2番目などの逆参照のグループ一致をキャプチャします(最大逆参照数\2までのみ設定できます)。\9
  • :label s/find/replace/; t labellabel成功した置換にジャンプし、コマンドを繰り返します。

またはより短いもの(入力形式によって異なります):

... |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

関連情報