나 이거 있는데 어디서거의내가 하고 싶은 일을 해라
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
(\n
ewline 제외).[^X]*X
: 모든 문자와 일치하지만 문자 뒤에 문자가 오는 경우에는 일치하지 않습니다X
(ewline 예외도 포함).\n
X
(...)
\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