Bash 스크립트의 패턴을 기반으로 문자열 추출

Bash 스크립트의 패턴을 기반으로 문자열 추출

Bash에서 문자열이 있다고 가정해 보겠습니다 strname.

strname="ph7go04325r"

추출하고 싶어요첫 번째 "3"성격과마지막 "r"문자를 입력 strname하고 결과를 문자열에 저장합니다 strresult. 위의 예에서 결과 strresult는 다음과 같습니다.

strresult="25"

첫 번째 "3"캐릭터는아니요마찬가지로 문자열 위치 8에 있어야 합니다 strname. 마지막 항목 "r"은 다음과 같습니다.아니요문자열 위치 11에 위치해야 합니다. 따라서 다음 문자열은 모두 다음을 strname생성해야 합니다 strresult="25".

strname="ph11go04325raa"
strname="325r"
strname="rgo04325raa"

또한 strname=ph12go04330raa"생성되어야 합니다 strresult="30".

저는 bash 스크립팅을 처음 접했고 이와 같은 문자열 패턴 일치를 어디서부터 시작해야 할지 모르겠습니다. 추천 메뉴가 무엇인가요?

답변1

정규식을 사용하여 bash(3.0 이상)에서 이 작업을 수행할 수 있습니다.

if [[ $strname =~ 3(.+)r ]]; then
    strresult=${BASH_REMATCH[1]}
else
    echo "unable to parse string $strname"
fi

Bash에서는 정규식의 캡처 그룹이 특수 배열에 배치됩니다 BASH_REMATCH. 요소 0에는 전체 일치 항목이 포함되고 요소 1에는 첫 번째 캡처링 그룹에 대한 일치 항목이 포함됩니다.

답변2

표준 sh구문(따라서 모든 버전 bash또는 기타 POSIX 호환 셸에서 사용할 수 있음)에서는 다음을 수행할 수 있습니다.

case $strname in
  (*3*r*) 
    strresult=${strname#*3}
    strresult=${strresult%r*};;
  (*)
    printf >&2 '%s\n' "Unable to parse string $strname"
esac

expr35년 된 Unices에서도 작동하는 이전 솔루션도 참조하세요 .

expr "x$strname" : 'x[^3]*3\(.*\)r'

장로특이한 점with 는 일치가 실패하면 0이 아닌 종료 상태를 얻습니다(괜찮습니다). 그러나 expr반환된 문자열이 0으로 해석되면( with 와 같이) 0이 아닌 종료 상태도 얻습니다.strname=zz300rzz

관련 정보