파일 이름 추출 및 바꾸기

파일 이름 추출 및 바꾸기

다음과 같이 전체 경로에서 파일 이름 부분을 추출합니다.

PATH=/a/b/c/foo.o  #1
BASE=${PATH##*/}   #2
BASE=${BASE/%.o/-1234.o}   #3
echo "$BASE"  

#2와 #3을 병합하는 방법이 있나요? 시도할 때마다 bad substitutionbash에서 일종의 오류가 발생합니다.

답변1

예, 모두 변수 이름이 필요하므로 대체 항목을 중첩할 수 없습니다.

그러나 단일 호출로 이 작업을 수행할 수 있습니다 basename.

base="$( basename "$pathname" .o )-1234.o"

두 번째 매개변수는 basename주어진 문자열에서 제거될 접미사입니다.


또한 쉘 스크립트에서 PATH변수에 대문자를 사용하는 것은정말 나쁜 생각이야, 쉘이 이 변수를 사용하여 외부 유틸리티를 찾기 때문입니다.

스크립트에서는 소문자 변수 이름을 사용하십시오. 이는 쉘에서 다른 목적으로 사용하는 쉘 변수 및 환경 변수와의 충돌을 방지하는 데 도움이 됩니다.

답변2

파일 확장자를 알 수 없는 경우(동적) -sed선택하다:

p="/a/b/c/foo.txt"
p=$(sed -E 's#.*/([^/]+)(\..*)$#\1-1234\2#' <<< "$p")

echo "$p"
foo-1234.txt

관련 정보