awk에서 두 개의 구분 기호 문제

awk에서 두 개의 구분 기호 문제

브랜치 이름과 설명을 표시하는 git 별칭을 만들려고 합니다. 분기에 대한 설명을 가져오는 특별한 명령이나 스위치는 없습니다. 구성에서 일시 중지해야 합니다. 그러나 모든 지점의 목록과 해당 설명(있는 경우)을 얻고 싶습니다.

다음과 같이 일종의 "원시 데이터"를 얻을 수 있습니다.

$ git config -l
core.symlinks=false
core.autocrlf=false
core.fscache=true
color.diff=auto

그래서 내가 관심 있는 항목은 다음과 같습니다.

branch.featureA.description=Mail templates
branch.featureB.description=Something else

이것을 파이프로 연결하여 다음을 얻을 수 있습니다. git config -l | grep description | grep \^branch.내가 원하는 출력의 경우 다음을 원합니다.

featureA Mail templates
featureB Something else

이를 표현하는 한 가지 방법은 마침표 다음의 두 번째 "열"과 등호 다음의 첫 번째 "열"을 원한다는 것입니다. 아니면 삭제 .branchname.하고 싶습니다 .description=. 최선의 방법은 잘 모르겠지만 awk문자열을 열로 처리해 보았습니다. 다양한 구분 기호를 사용하여 원하는 부분을 얻을 수 있습니다.

$ git config -l | grep description | grep \^branch. | awk -F '.' '{ print $2 }'
featureA
featureB

$ git config -l | grep description | grep \^branch. | awk -F '=' '{ print $2 }'
Mail Templates
Something else

그러나 두 구분 기호를 결합하려고 하면 작동하지 않는 것 같습니다.

$ git config -l | grep description | grep \^branch. | awk -F '.=' '{ print $2 }'
Mail templates
Something else

문자열에서 원하는 데이터를 어떻게 구문 분석할 수 있나요?

답변1

나는 sed이것을 사용할 수 있습니다 :

sed -n '/^branch/{ s/[^.]*\.//; s/\.[^=]*=/ /p; }'

이것은 문자열로 시작하는 모든 줄 branch과 모든 줄을 캡처합니다.

  1. 첫 번째 지점 이전의 모든 항목을 삭제한 다음
  2. =첫 번째 남은 지점부터 첫 번째 문자를 포함한 모든 항목을 공백으로 바꿉니다.

그런 다음 수정된 줄을 인쇄합니다. 다른 행은 삭제됩니다.


그리고 awk:

awk -F '=' '/^branch/ { split($1, a, "."); print a[2], $2 }'

이는 입력을 분리된 것으로 처리 =한 다음 첫 번째 부분을 점으로 분할합니다. 그런 다음 점으로 구분된 두 번째 문자열도 인쇄합니다 =.

줄에 둘 이상이 포함되어 있으면 이 작업은 실패합니다 =(두 번째 비트 이후의 비트는 =손실됩니다).

답변2

또 다른 접근 방식은 다음과 같습니다 sed.

git config -l | sed -n 's/^branch[.]\(.*\)[.]description=/\1 /p'

설명: (something) 사이에 공백 하나만 포함하여 "branch.(something).description=(something)" 형식의 모든 행을 인쇄합니다. 이렇게 하면 -n이 패턴과 일치하지 않는 줄을 자동으로 인쇄하는 것을 방지할 수 있습니다.

답변3

Bash를 사용하여 이 작업을 수행할 수 있습니다.

while IFS="=" read key value; do 
    if [[ key == branch.*.description ]]; then
        branch=${key#branch.}        # remove "branch." prefix
        branch=${key%.description}   # remove ".description" suffix
        echo "$branch $value" 
    fi
done < <(git config -l)

저는 의도적으로 이 줄을 두 번 "분할"했습니다. 첫 번째는 동일합니다.그 다음에알맞다. "값"은 분명히 약간일 수 있으므로 단어 분할을 완전히 제어하고 싶습니다.

관련 정보