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

두 번째 캡처 그룹의 's를 대체하고 있지만 두 번째 부분의 only도 캡처해야 하기 때문에 대체할 방법을 -찾을 수 없습니다 .-

나는 여기 있다윈도우용 자식, 포함된 도구로만 가능합니다. 이를 수행하는 더 많은 프로그래밍 방식이 있을 수 있지만(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까지만 구성할 수 있습니다 ).\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의 구성을 사용하면 다음과 같은 출력을 얻을 수 있습니다.

참고: 저는 정규식을 변경하지 않았고 일부 부분만 조정했습니다. 네 번째 게임이 필요하다고 가정하면 다음 {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

관련 정보