やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

バージョン文字列を数値としてソートする(bash `sort --version-sort`)

 sort -Vでも可。

結論

git tag | sort -V # 昇順
git tag | sort -Vr # 降順

 フルネームだと以下。

git tag | sort --version-sort
git tag | sort --version-sort --reverse

 検証用。

echo -e "v1.9\nv1.10\nv1.11" | sort -V
echo -e "v1.9\nv1.10\nv1.11" | sort -Vr

探したログ

 前回、GitHubにてリリースすべくバージョンタグを付与した。以下コマンドでタグ一覧できる。

git tag

 しかし、昇順である。これを最新順にしたい。このとき、数値として大小比較してほしい。

 以下でソートすると文字列比較の降順になる。1.21.11よりも大きくなってしまう問題をなんとかしたい。

git tag | sort --reverse
echo -e "1.2\n1.11" | sort --reverse

 桁数が一致しているうちは問題ない。

echo -e "2\n3\n1" | sort
echo -e "2\n3\n1" | sort -r
echo -e "1.2\n1.3\n1.1" | sort
echo -e "1.2\n1.3\n1.1" | sort -r

 桁数が合わなくなると文字列比較の弊害が出る。以下のとおり。

echo -e "1.9\n1.10\n1.11" | sort
echo -e "1.9\n1.10\n1.11" | sort -r

 -tで区切り文字を指定し、-nで数値としてソートするらしい。

 だが、以下のようにしてもダメだった。

echo -e "1.9\n1.10\n1.11" | sort -t '.' -n
echo -e "1.2\n1.11" | sort --reverse -t '.' -n

 以下で成功!

echo -e "1.9\n1.10\n1.11" | sort --version-sort

 vプレフィクスがついていてもOK!

echo -e "v1.9\nv1.10\nv1.11" | sort --version-sort

対象環境

$ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux