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最初の2つのフィールドを選択しました.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

関連情報