Bash: 문자열의 하위 문자열을 일치시키고 키-값 쌍을 추출합니다.

Bash: 문자열의 하위 문자열을 일치시키고 키-값 쌍을 추출합니다.

다음과 같을 것으로 예상되는 문자열이 있습니다.

final old-version=1.2.3-old new-version=1.2.4

old-version문자열에서 버전 번호를 추출하고 두 개의 변수 를 만들려고 합니다 new-version.

old-version=1.2.3-old
new-version=1.2.4

이것이 내가 생각해낸 것입니다:

x='final old-version=1.2.3-old new-version=1.2.4'
echo $x | awk '{print $2}' | cut -d'=' -f2

이것을 사용하여 나는 가치를 얻었습니다 old-version. 그러나 어떤 이유로든 다음과 같은 문자열이 표시되면 이 접근 방식은 매우 빠르게 중단됩니다.final new-version=1.2.4 old-version=1.2.3-old

하위 문자열과 그 값을 추출하는 더 좋고, 더 깨끗하고, 더 안정적인 방법이 있나요?

답변1

bash 쉘 및 PE 매개변수를 사용하여 확장 및 읽기

x='final old-version=1.2.3-old new-version=1.2.4'
read -r _ old new <<< "$x"; printf '%s\n' "${old#*=}" "${new#*=}"

또는 -a읽기 옵션이 있는 배열을 사용하세요.

x='final old-version=1.2.3-old new-version=1.2.4'
read -ra var <<< "$x"; printf '%s\n' "${var[1]#*=}" "${var[2]#*=}"

답변2

여러 단계를 사용해도 괜찮다면 bash내장 함수를 사용하여 이 작업을 완전히 수행 할 수 있습니다.

x='final old-version=1.2.3-old new-version=1.2.4'

oldnew=${x#* }          # "old-version=1.2.3-old new-version=1.2.4"
old=${oldnew% *}        # "old-version=1.2.3-old"
new=${oldnew#* }        # "new-version=1.2.4"

oldversion=${old#*=}    # "1.2.3-old"
newversion=${new#*=}    # "1.2.4"

echo "Old version is >$oldversion<"
echo "New version is >$newversion<"

#및 연산자의 두 가지 예로서 %,

  • 이 구성은 string 앞에서 ${x#* }glob과 일치하는 문자열을 제거합니다 .*{space}$x
  • 이 구성은 문자열 뒤에서 ${oldnew% *}glob과 일치하는 문자열을 제거합니다.{space}*

$x여기에 배열을 사용하여 공백에서 변수를 분할하는 훨씬 짧은 또 다른 버전이 있습니다.

x='final old-version=1.2.3-old new-version=1.2.4'

oldnew=($x)                   # array ('final', 'old-version=1.2.3-old', 'new-version=1.2.4')
oldversion=${oldnew[1]#*=}    # "1.2.3-old"
newversion=${oldnew[2]#*=}    # "1.2.4"

echo "Old version is >$oldversion<"
echo "New version is >$newversion<"

관련 정보