Shell 파일 이름과 접 두 사 를 캡 처
파일 이름과 접 두 사 를 캡 처 합 니 다.
Shell 스 크 립 트 를 작성 하 는 과정 에서 파일 이름과 파일 경 로 를 자주 만 납 니 다.사용자 가 파일 의 전체 이름(절대 경로 와 파일 접 두 사 를 포함 할 수 있 음)을 입력 하면 파일 의 경로 이름,파일 이름,파일 접두사 등 정 보 를 어떻게 얻 을 수 있 습 니까?셸 스 크 립 트 는 강력 한 문자열 처리 능력 을 가지 고 있 습 니 다.파일 이름 을 문자열 로 사용 하면 cut 나 sed 같은 도 구 를 사용 하여 원 하 는 결 과 를 얻 기 어렵 지 않 습 니 다.
$fullfile=/the/path/foo.txt
$fullname=$(basename $fullfile)
$dir=$(dirname $fullfile)
$filename=$(echo $fullname | cut -d . -f1)
$extension=$(echo $fullname | cut -d . -f2)
$ echo $dir , $fullname , $filename , $extension
/the/path , foo.txt , foo , txt
여기 서basename명령 을 사용 하면 접 두 사 를 포함 하 는 파일 이름 을 직접 얻 을 수 있 고dirname명령 은 경로 이름 을 얻 을 수 있 으 며,그 다음 에 간단하게 cut 로 파일 이름과 접 두 사 를 캡 처 할 수 있 습 니 다.
더 복잡 한 상황
간단 한 응용 장면 에 대처 하면 여기까지 작업 을 마 칠 수 있 습 니 다.그러나 가끔 은 파일 에 하나의 접미사 만 있 는 것 이 아 닐 수도 있 습 니 다.예 를 들 어*.tar.gz 는 어떻게 마지막 접 두 사 를 얻 습 니까?다시 잘라 볼 까?물론 입 니 다.하지만 파일 이름 이 my lib.1.0.1a.zip 이 라면 요?어...정규 표현 식 은 가능 할 거 야.
$ fullname=mylib.1.0.1a.zip
$ filename=$(echo $fullname | sed 's/\.[^.]*$//')
$ extension=$(echo $fullname | sed 's/^.*\.//')
$ echo $filename, $extension
mylib.1.0.1a, zip
이 안의 논 리 는 이렇다.
.
문자 로 시작 한 후 줄 끝 까지 비.
문자 의 하위 문자열 을 비 웁 니 다..
문자 로 끝 나 는 하위 문자열 을 비 웁 니 다.말로 만 이 두 정규 표현 식 을 묘사 해도 뇌 세포 가 많이 죽는다.위 컷 버 전 처럼 쉽게 이해 할 수 있 는 방법 없 을까요?
.
구분자 의 개수 가 확실 하지 않 기 때문에 마지막.
문 자 를 잘라 내 는 것 은 불가능 합 니 다.그러나 우 리 는rev명령 을 사용 하여 문자열 을 반전 시 키 고 접미사 와 파일 이름 을 구분 하 는.
문자 의 위 치 를 확정 할 수 있 습 니 다.원 하 는 부분 을 캡 처 한 후 다시 반전 하면 우리 가 원 하 는 내용 을 얻 을 수 있다.$ fullname=mylib.1.0.1a.zip
$ filename=$(rev <<< $fullname | cut -d . -f2- | rev)
$ extension=$(rev <<< $fullname | cut -d . -f1 | rev)
$ echo $filename, $extension
mylib.1.0.1a, zip
매개 변수 확장 사용
복잡 한 정규 표현 식 을 빌 리 지 않 고 basename,dirname,cut,sed 명령,셸 스 크 립 트 처럼 모든 작업 을 할 수 있 습 니 다.아래 의 실현 을 보면:
$ fullfile=/the/path/mylib.1.0.1a.zip
$ fullname="${fullfile##*/}"
$ dir="${fullfile%/*}"
$ extension="${fullname##*.}"
$ filename="${fullname%.*}"
$ echo $dir , $fullname , $filename , $extension
/the/path , mylib.1.0.1a.zip , mylib.1.0.1a , zip
더 이상 간결 할 수 없습니다.대괄호 안에 있 는 변수 이름 이 몇 개의 신기 한 문자 와 결합 하 는 것 이 바로 Shell 의 매개 변수 확장Parameter Extension기능 입 니 다.
${fullfile##*/}
:앞에서 부터 fullfile 에서 최대 일치 하 는 문자열(longest matching pattern)*/
을 삭제 합 니 다${fullfile%/*}
:fullfile 에서 최소 일치 하 는 문자열(shortest matching pattern)/*
을 뒤에서 삭제 합 니 다${fullname##*.}
:앞에서 부터 fullname 에서 최대 일치 하 는 문자열(longest matching pattern)*.
을 삭제 합 니 다${fullname%.*}
:fullname 에서 최소 일치 하 는 문자열(shortest matching pattern).*
을 뒤에서 삭제 합 니 다매개 변수 확장 기능 목록
매개 변수 형식
확장 후
x{y,z}
xy xz
${x}{y, z}
${x}y ${x}z
${x}{y, $z}
${x}y ${x}${z}
${param#pattern}
param 앞에서 pattern 의 최소 일치 삭제
${param##pattern}
param 앞에서 pattern 의 최대 일치 삭제
${param%pattern}
param 뒤에서 pattern 의 최소 일치 삭제
${param%%pattern}
param 뒤에서 pattern 의 최대 일치 삭제
${param/pattern/string}
param 에서 pattern 을 string 으로 바 꾸 는 첫 번 째 일치,string 은 비어 있 습 니 다.
${param//pattern/string}
param 에서 string 으로 pattern 의 모든 일치 성 을 바 꾸 면 string 이 비어 있 습 니 다.
${param:3:2}
$param 에서 색인 3 을 시작 하 는 두 문 자 를 캡 처 합 니 다.
${param:3}
$param 에서 색인 3 에서 끝 까지 의 문 자 를 캡 처 합 니 다.
${@:3:2}
매개 변수 목록$@에서 세 번 째 로 시작 하 는 두 개의 매개 변 수 를 캡 처 합 니 다.
${param:-word}
$param 이 비어 있 거나 설정 되 지 않 으 면 매개 변수 식 으로 워드 를 되 돌려 줍 니 다.$param 은 변 하지 않 습 니 다.
${param:+word}
$param 이 비어 있 지 않 으 면 매개 변수 식 으로 워드 를 되 돌려 줍 니 다.$param 은 변 하지 않 습 니 다.
${param:=word}
$param 이 비어 있 거나 설정 되 어 있 으 면 매개 변수 식 으로 워드 를 되 돌려 주 고$param 은 워드 로 설정 합 니 다.
${param:?message}
$param 이 비어 있 거나 설정 되 어 있 으 면 잘못된 정보 message 를 출력 합 니 다.공백 문자 가 포함 되 어 있 으 면 따옴표 가 필요 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.