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; }'

おすすめ記事