如何获取字符顺序的两个字符之间的子字符串?

如何获取字符顺序的两个字符之间的子字符串?

问题描述:

我有一个Unix shell脚本,我想获取_和 - 之间的子串,但不是 - 和_。如何获取字符顺序的两个字符之间的子字符串?

例子:

cs-ui-21140322175352_8ddjdb1b4cc4a87d17034dd3704q5a0ea60d6d87-2.x86_64 

我想提取:

8ddjdb1b4cc4a87d17034dd3704q5a0ea60d6d87 

并将其存储在一个变量。

你可以有更多的下注和其他东西比你的示例输入。 为您的样品输入,你可以做这样的事情

newvar=$(echo "${inputstr}" | sed -e 's/[^_]*_//' -e 's/-.*//') 
# or 
newvar=$(echo "${inputstr}" | sed -e 's/.*_\(.*\)-.*/\1/') 
# or 
newvar=$(echo "${inputstr}" | cut -d "_" -f2 | cut -d "-" -f1) 
+0

我放在了第一位拿到64。第二个工作正常。最后一个给我一个错误:切:[-cf]列表:非法列表值 切:[-cf]列表:值可能不包括零 – Nelson

+0

对不起,更正。第一个是贪婪的''*',只需要告诉吃除_以外的所有东西。剪切分隔符是选项d,而不是c。 –

inputstr=cs-ui-21140322175352_8ddjdb1b4cc4a87d17034dd3704q5a0ea60d6d87-2.x86_64 

newvar=`echo $inputstr | sed 's,.*_\(.*\)-.*,\1,'` 
+0

这看起来像我的第二个解决方案。请注意'$(cmd)'比backtics更安全,更简单。 –