bash - 첫 번째 구분 기호 앞과 뒤의 문자열 가져오기

bash - 첫 번째 구분 기호 앞과 뒤의 문자열 가져오기

값이 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

관련 정보