문자열의 공백으로 구분된 부분 추출

문자열의 공백으로 구분된 부분 추출

파일이 포함된 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")

관련 정보