프로그램에서 출시된 버전을 설치하기 위해 .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
부분을 관찰하십시오). 이 목표를 달성하는 방법은 무엇입니까?
두 가지 가능한 시나리오를 고려하십시오. 파일 이름은 다음과 같을 수 있습니다.
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,}"
최소한 한 자리 숫자로 시작하는 모든 문자열과 일치합니다([0-9]+
), 두 개 이상의 숫자 및/또는 .
_
문자([0-9\.\_]{2,}
). 이것은 물론 64_
세 번째 예와도 일치하므로 마지막 일치 항목(tail -1
). 마지막으로 여기에는 후행이 포함되므로 .
이를 제거하겠습니다.sed 's/\.$//'
.
나는 내가 보여준 것보다 이 작업을 수행하는 더 깔끔한 방법이 있다고 확신합니다.