我有一个字符串 $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'