값이 2022.2.1인 필드 버전이 있습니다. 값을 구해야 해요2022.2내 모든 예에서(첫 번째 구분 기호 앞과 뒤의 문자열)
version="2022.2.1"
echo "${version%.*}"
2022.2
이것은 작동합니다. 하지만 버전에 구분 기호로 여러 개의 점이 포함되어 있으면 작동하지 않습니다(예 version="2022.2.1.1"
: ). 여기에 값이 필요합니다.2022.2
version="2022.2.1 2021.1.0"
또는 버전에 여러 버전이 포함되어 있어도 작동하지 않습니다( ). 다시 말하지만, 이 예에서는 첫 번째 값만 필요하며 첫 번째 구분 기호 앞뒤의 첫 번째 문자열입니다. 그래서 나는 항상 가치를 얻고 싶습니다.2022.2
이 사용 사례에 대한 모범 사례는 무엇입니까? 감사해요!
답변1
변수 수정을 통해서는 이 작업을 쉽게 수행할 수 없습니다. 여기에서는 구분된 cut
처음 두 개의 필드를 선택 했습니다 .
( man cut
자세한 내용 참조).
for version in '2022.2.1' '2022.2.1.1' '2022.1.1 2021.1.0'
do
shorter=$(cut -d. -f1-2 <<<"$version")
printf "version=%s => %s\n" "$version" "$shorter"
done
산출
version=2022.2.1 => 2022.2
version=2022.2.1.1 => 2022.2
version=2022.1.1 2021.1.0 => 2022.1
POSIX 쉘이 없는 경우 <<<
문자열을 다음으로 파이프할 수 있습니다.cut
shorter=$(printf "%s\n" "$version" | cut -d. -f1-2)
답변2
일반 bash를 사용하면 다음을 수행할 수 있습니다.
분할 및 병합
IFS=. read -ra fields <<< "$version" ver2=$(IFS=.; echo "${fields[*]:0:2}")
정규식 캡처
[[ $version =~ ([^.]+\.[^.]+) ]] && ver2=${BASH_REMATCH[1]}
답변3
그리고 zsh
:
$ set -o extendedglob
$ print -r -- ${(M)version##[^.]#.[^.]#}
2022.2
(M)
M
결합 부분이 벗겨지지 않고 선도 부분이 결합 되도록 팽창이 발생합니다 .
$ print -r -- ${(j[.])${(s[.])version}[1,2]}
2022.2
(처음 2개의 결과 단어와는 별개 s
)..
j
.
POSIX적으로:
printf '%s\n' "${version%".${version#*.*.}"}"
또는:
$ LC_ALL=C expr "x$version" : 'x\([^.]*\.[^.]*\)'
2022.2