プログラムからリリースされたバージョンをインストールするために、.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_9
か11.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/\.$//'
。
私は私が示したものよりもこれを行うよりきれいな方法があると確信しています。