다음과 같을 것으로 예상되는 문자열이 있습니다.
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<"