1

У меня есть строка как $ 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/.*/};

но это не работает, пожалуйста, помогите

3 ответа3

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
0

Как вы определяете, какие символы извлечь? Если символы всегда появляются в определенных местах строки, например, если это строка фиксированной длины или символы, которые вам нужны, это последние 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
0

Зависит от того, как ваша переменная может выглядеть в других случаях.

Это может быть так просто, как:

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

или же

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .