파일이 포함된 Git 저장소가 여러 개 있습니다.mergedriver.info
파일은 항상 다음과 같습니다.
<project name>
<repository name>
Git 병합 드라이버에 의해 트리거된 스크립트는 이 파일을 평가합니다.
mergedriverinfo="$(git cat-file -p HEAD:mergedriver.info)"
success=$?
if [[ "$success" == "0" ]]; then
log "Evaluating mergedriver.info"
PROJECT_KEY="$(sed -E 's/([^\s]+)\s+([^\s]+)/\1/' <<< $mergedriverinfo)"
REPO_SLUG="$(sed -E 's/([^\s]+)\s+([^\s]+)/\2/' <<< $mergedriverinfo)"
log "PROJECT_KEY=$PROJECT_KEY"
log "REPO_SLUG=$REPO_SLUG"
else
log "Unable to read mergedriver.info"
exit 1
fi
이 경우 sed의 동작을 이해하지 못합니다.
이를 위해 mergedriver.info
:
test
conflict-on-auto-merge
로그 출력은 다음과 같습니다.
2017-07-20 11:05:51.747 PROJECT_KEY=test
2017-07-20 11:05:51.748 REPO_SLUG=tesconflict-on-auto-merge
처음에는 mergedriver.info를 사용 sed -n 1p/2p
하고 head
/읽으려고 시도했지만 불행하게도 tail -1
이 스크립트를 실행하는 두 가지 플랫폼의 출력이 달랐습니다.$(git cat-file -p HEAD:mergedriver.info)
플랫폼 1:
$ od -c <<< $(git cat-file -p HEAD:mergedriver.info)
0000000 t e s t \n c o n f l i c t - o n
0000020 - a u t o - m e r g e \n
0000034
플랫폼 2:
± od -c <<< $(git cat-file -p HEAD:mergedriver.info)
0000000 t e s t c o n f l i c t - o n
0000020 - a u t o - m e r g e \n
0000034
이 문제를 해결하는 방법?
답변1
sed
정규 표현식은 [^\s]
해야 한다고 생각하는 작업을 수행하지 않는다는 점을 깨달아야 합니다 . 공백이 아닌 문자를 찾지만 백슬래시 \
와 문자라는 두 문자를 무효화합니다 s
.
\S
특히 이 목적을 위해 필요한 것이 있습니다 .
여러 줄에 걸쳐 표시되는 Manage mergedriver.info 명령의 출력은 도구 상자 N
의 명령입니다.sed
PROJECT_KEY=$(sed -nEe '$!N;s/(\S+)\s+(\S+)/\1/p' <<<"$mergedriverinfo")
REPO_SLUG=$(sed -nEe '$!N;s/(\S+)\s+(\S+)/\2/p' <<<"$mergedriverinfo")