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
expr
35년 된 Unices에서도 작동하는 이전 솔루션도 참조하세요 .
expr "x$strname" : 'x[^3]*3\(.*\)r'
장로특이한 점with 는 일치가 실패하면 0이 아닌 종료 상태를 얻습니다(괜찮습니다). 그러나 expr
반환된 문자열이 0으로 해석되면( with 와 같이) 0이 아닌 종료 상태도 얻습니다.strname=zz300rzz