Bash: 변수의 줄 끝에서 부분을 추출하는 방법은 무엇입니까?

Bash: 변수의 줄 끝에서 부분을 추출하는 방법은 무엇입니까?

uniqueIDBash 스크립트의 맥락에서 uniqueID_db.dat다음과 같은 URL 부분에서 고유 ID를 추출하려면 어떻게 해야 합니까?

https://cdn.somedomain.com/fetch/uniqueID/uniqueID_db.dat
https://server123456.eu.somedomain.com/789/storage/uniqueID/uniqueID_db.dat
https://cdn.somedomain.com/fetch/6234449e1539130b/6234449e1539130b_db.dat
https://server654321.eu.somedomain.com/0123/storage/afd85b3f9ae5bc9/afd85b3f9ae5bc9_db.dat

행은 항상 끝납니다 _db.dat. 추출하려는 것은 그 앞에 있는 고유 ID입니다.

모든 행은 변수에 있습니다 $link.

sed추출을 위해 다른 도구를 사용할 수 있습니까? 그렇다면 어떻게 해야 할까요? 제가 배울 수 있도록 어떻게 작동하는지 설명해 주실 수 있나요?

나는 다음과 같은 것을 상상한다:

echo "${link}" | sed '...'

감사해요.

답변1

-) link='https://server123456.eu.somedomain.com/789/storage/uniqueID/uniqueID_db.dat'
-) #.. Remove averything up to last /
-) uid="${link##*/}"
-) echo "${uid}"
uniqueID_db.dat
-) #.. Remove the suffix.
-) uid="${uid%_db.dat}"
-) echo "${uid}"
uniqueID
-) 

GNU Bash 참조 매뉴얼의 섹션 3.5.3에 이에 대한 내용이 많이 있습니다.

https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion

쌍을 원한다면 uniqueID/uniqueID조심하세요. 이러한 Bash 구성은 번거로워 보일 수 있지만 몇 바이트를 편집하기 위해 외부 프로세스를 시작하는 것보다 낫습니다.

-) link='https://server123456.eu.somedomain.com/789/storage/uniqueID/uniqueID_db.dat'
-) #.. Extract the prefix.
-) pfx="${link%/*/*}"
-) #.. Substring the link from after the prefix.
-) uid="${link:${#pfx}}"
-) echo "${uid}"
/uniqueID/uniqueID_db.dat
-) #.. Clip front and back.
-) uid="${uid#/}"
-) uid="${uid%_db.dat}"
-) echo "${uid}"
uniqueID/uniqueID
-) 

답변2

당신은 그것을 사용할 수 있습니다 awk:

awk -F '[/_]' '{print $(NF-1)}' file

또는 grepcut:

grep -o '[^/]*$' file | cut -d_ -f1

또는 grep -P:

grep -Po '[^/]*(?=_db.dat$)' file

또는 sed:

sed -E 's/(.*\/)([^/]*)_db.dat$/\2/' file

관련 정보