bash는 문자열에서 하위 문자열을 제거합니다.

bash는 문자열에서 하위 문자열을 제거합니다.

package-0.0.1.jar과 같은 패키지 이름이 있고 해당 문자열에서 버전 정보와 .jar로 끝나는 파일을 제거해야 합니다. 이 목표를 어떻게 달성할 수 있나요? "%" 기호를 사용하여 문자열의 일부를 잘라낼 수 있다는 것을 발견했습니다. 그래서 나는 노력했다

JNAME="package-0.0.1.jar"
CLEAN="${JNAME%-.*\.jar}"

그러나 CLEAN 뒤에는 전체 JNAME 콘텐츠가 있으므로 이는 작동하지 않는 것 같습니다. % 기호 다음의 올바른 순서는 무엇입니까?

답변1

%/를 사용한 확장은 #정규 표현식을 사용하지 않으며 쉘 글로브를 사용합니다. -*.jar버전과 접미사를 일치시키는 데에만 사용됩니다 .

CLEAN=${JNAME%-*.jar}

정규 표현식이 필요한 경우 Bash의 [[ a =~ b ]]합계를 사용할 수 있습니다 ${BASH_REMATCH[…]}(이 경우에는 필요하지 않지만).

if [[ $JNAME =~ ^(.+)-[^-]+\.jar$ ]]; then
    CLEAN=${BASH_REMATCH[1]}
fi

답변2

또 다른 접근 방식은 이 목적을 위한 것입니다 awk(이름이 대시로 끝나기를 원한다고 가정).

CLEAN=$(printf '%s' "$JNAME" | awk -F- '{print $1}')

관련 정보