Bash:如何从变量中的行尾提取部分?

Bash:如何从变量中的行尾提取部分?

uniqueID在 bash 脚本的上下文中,如何从uniqueID_db.dat诸如此类的 URL 部分中提取,其中 uniqueID 可以是任何内容,例如:

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,我想提取的是其之前的 uniqueID。

任何行都在变量中$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

相关内容