cutコマンド:フィールドの位置を説明/含むために区切り文字を使用する方法は?

cutコマンド:フィールドの位置を説明/含むために区切り文字を使用する方法は?

プログラムからリリースされたバージョンをインストールするために、.gz/.zipから特定のファイルを抽出したいと思います。

したがって、ifが実行されます(単純化のために次のように表示されます)。

echo "apache-maven-3.8.4-bin.tar.gz" | cut -d'-' -f 3
echo "gradle-7.3.1-bin.zip"          | cut -d'-' -f 2

彼らはそれぞれと3.8.4を返します7.3.1。これまでのところすべてが大丈夫で予想通りです。

ただし、次のファイル名を検討してください。

  • OpenJDK11U-jdk_x64_linux_hotspot_11.0.14_9.tar.gz

11.0.14_9これまで抽出する必要があります。

echo "OpenJDK11U-jdk_x64_linux_hotspot_11.0.14_9.tar.gz" | cut -d'_' -f 5

それは返され、11.0.14私は必要です11.0.14_9(該当する_9部分を観察してください)。この目標を達成する方法は?

2 つの考えられるシナリオを考えてみましょう。ファイル名は次のようになります。

OpenJDK11U-jdk_x64_linux_hotspot_11.0.14_9.tar.gz # with    '_number'
OpenJDK11U-jdk_x64_linux_hotspot_11.0.14.tar.gz   # without '_number'

何ができるだろうか?ユニーク「動的」コマンド -できれば- 返しましょう11.0.14_911.0.14

このシナリオで他のコマンドを使用できる場合はお知らせください。

答え1

grep -Eo "[0-9]+[0-9\.\_]{2,}" | tail -1 | sed 's/\.$//'見苦しく見えますが、あなたの例ではうまくいきます。

echo "apache-maven-3.8.4-bin.tar.gz" | grep -Eo "[0-9]+[0-9\.\_]{2,}" | tail -1 | sed 's/\.$//'
3.8.4
echo "gradle-7.3.1-bin.zip" | grep -Eo "[0-9]+[0-9\.\_]{2,}" | tail -1 | sed 's/\.$//'
7.3.1
echo "OpenJDK11U-jdk_x64_linux_hotspot_11.0.14_9.tar.gz" | grep -Eo "[0-9]+[0-9\.\_]{2,}" | tail -1 | sed 's/\.$//'
11.0.14_9

grep -Eo "[0-9]+[0-9\.\_]{2,}"少なくとも1桁の数字で始まるすべての文字列と一致します([0-9]+)、2つ以上の数字および/または. _文字([0-9\.\_]{2,})。これはもちろん64_3番目の例とも一致するので、最後の一致(tail -1)。最後に、これには末尾が含まれているので、.それを削除します。sed 's/\.$//'

私は私が示したものよりもこれを行うよりきれいな方法があると確信しています。

関連情報