从shell脚本中的字符串中提取一个单词

从shell脚本中的字符串中提取一个单词

我有一个字符串 $sea = xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz

我只想提取 DMJK.UK.1.0-32133-Z-1 并且搜索字符串将是 DMJK

我试过

echo $sea
y=${sea/\/*\//};
echo ${y/.*/};

但它不起作用,请帮忙

答案1

您想如何选择删除什么和保留什么,这一点并不明确。这是获得所需结果的众多方法之一:

$ sea=xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz
$ sea2=${sea/*[[:lower:]]-/}; echo ${sea2%.*}
DMJK.UK.1.0-32133-Z-1

DMJK或者,这包括以 开头和结尾的部分.tgz

$ sea2=${sea/*DMJK/DMJK}; echo ${sea2%.tgz}
DMJK.UK.1.0-32133-Z-1

即使.tgz不存在,同样的方法也有效:

$ sea=xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1
$ sea2=${sea/*DMJK/DMJK}; echo ${sea2%.tgz}
DMJK.UK.1.0-32133-Z-1

答案2

您如何确定要提取哪些字符?如果字符始终出现在字符串中的特定位置,例如,如果它是固定长度的字符串,或者您需要的字符是点之前的最后 21 个字符和 3 个字符的扩展名,则可以在 Bash 脚本中使用以下之一:

sea="xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz"

echo $sea
# If characters are always in positions 33 to 50
y=${sea:33:21}
echo $y

# If y always start 5 positions from the end and goes back 21 characters
# For negative numbers you need to put a space between the colon and the
# number
#
# Get the last 25 characters in the string
y=${sea: -25}
# Now discard the last 4, which are the dot and 3 character extension
y=${y:0:21}
echo $y

答案3

取决于你的变量在其他情况下的表现方式。

它可以简单到:

echo $sea | cut -d '-' -f 7- | cut -d . -f -4

或者

echo $sea | sed 's#.*\(DMJK.*\).tgz#\1#g'

相关内容