У меня есть строка $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'