http 링크가 있습니다 :
http://www.test.com/abc/def/efg/file.jar
마지막 부분 file.jar을 변수에 저장하려고하므로 출력 문자열은 “file.jar”입니다.
조건 : 링크 길이가 다를 수 있습니다. 예 :
http://www.test.com/abc/def/file.jar.
나는 그런 식으로 시도했다 :
awk -F'/' '{print $7}'
이지만 문제는 URL 길이이므로 모든 URL 길이에 사용할 수있는 명령이 필요합니다.
답변
awk
이것을 사용하면 효과가 있지만 곡사포로 사슴을 사냥하는 것입니다. 이미 URL을 가지고 있다면 쉘 변수에 넣고 bash
내장 매개 변수 대체를 사용하면 원하는 작업을 수행하는 것이 매우 간단합니다 .
$ myurl='http://www.example.com/long/path/to/example/file.ext'
$ echo ${myurl##*/}
file.ext
이것이 작동하는 방식은 탐욕스럽게 ‘* /’와 일치하는 접두사를 제거하는 것입니다 ##
.
${haystack##needle} # removes any matching 'needle' from the
# beginning of the variable 'haystack'
답변
basename
그리고 dirname
너무 URL에 대한 작업 좋은 :
> url="http://www.test.com/abc/def/efg/file.jar"
> basename "$url"; basename -s .jar "$url"; dirname "$url"
file.jar
file
http://www.test.com/abc/def/efg
답변
을 사용 awk
하면을 사용 $NF
하여 필드 수에 관계없이 마지막 필드를 가져올 수 있습니다.
awk -F / '{print $NF}'
해당 문자열을 쉘 변수에 저장하면 다음을 사용할 수 있습니다.
a=http://www.test.com/abc/def/efg/file.jar
printf '%s\n' "${a##*/}"
답변
게시 된 답변의 대부분은 다음과 같이 쿼리 문자열 또는 대상이 포함 된 URL에서 강력하지 않습니다.
https://example.com/this/is/a/path?query#target
파이썬은 표준 라이브러리에 URL 파싱을 가지고 있습니다. 그렇게하는 것이 더 쉽습니다. 예 :
from urllib import parse
import sys
path = parse.urlparse(sys.stdin.read().strip()).path
print("/" if not path or path == "/" else path.rsplit("/", 1)[-1])
python3 -c
쉘 스크립트에서 사용하기 위해 하나로 압축 할 수 있습니다 .
echo 'https://example.com/this/is/a/path/componets?query#target' \
| python3 -c 'from urllib import parse; import sys; path = parse.urlparse(sys.stdin.read().strip()).path; print("/" if not path or path == "/" else path.rsplit("/", 1)[-1])'
(가독성을 위해 스크립트를 나눌 수도 있습니다. '
개행을 넣을 수 있습니다.)
물론, 이제 쉘 스크립트는 파이썬에 의존합니다.
(URL 경로 구성 요소가 루트 ( /
) 인 경우를 처리하려고하는지 여부는 확실하지 않습니다 . 중요한 경우 조정 / 테스트하십시오.)
답변
한 가지 방법은 rev
URL에서 필드를 잘라낸 다음 rev
다시하는 것입니다. 예 :
echo 'http://www.test.com/abc/def/efg/file.jar ' | rev | cut -d '/' -f 1 | rev
산출:
file.jar
예 2 :
echo 'http://www.test.com/abc/cscsc/sccsc/def/efg/file.jar ' | rev | cut -d '/' -f 1 | rev
산출:
file.jar