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
或grep
和cut
:
grep -o '[^/]*$' file | cut -d_ -f1
或者grep -P
:
grep -Po '[^/]*(?=_db.dat$)' file
或者sed
:
sed -E 's/(.*\/)([^/]*)_db.dat$/\2/' file