Извлечь слово из строки в скрипте оболочки

Извлечь слово из строки в скрипте оболочки

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

Связанный контент