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부분을 관찰하십시오). 이 목표를 달성하는 방법은 무엇입니까?

두 가지 가능한 시나리오를 고려하십시오. 파일 이름은 다음과 같을 수 있습니다.

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/\.$//'.

나는 내가 보여준 것보다 이 작업을 수행하는 더 깔끔한 방법이 있다고 확신합니다.

관련 정보