Extraia uma palavra de uma string em shell script

Extraia uma palavra de uma string em shell script

Eu tenho uma string como $sea = xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz

e eu quero extrair apenas DMJK.UK.1.0-32133-Z-1 e a string de pesquisa será DMJK

eu tentei tipo

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

mas não está funcionando, por favor me ajude

Responder1

Como você deseja escolher o que remover e o que manter não está nada claro. Esta é uma das muitas maneiras de obter o resultado que você solicita:

$ 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

Como alternativa, isso inclui as partes que começam DMJKe terminam no final .tgz:

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

Essa mesma abordagem funciona mesmo se .tgznão estiver presente:

$ 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

Responder2

Como você está determinando quais caracteres extrair? Se os caracteres sempre aparecerem em locais específicos da string, por exemplo, se for uma string de comprimento fixo ou se os caracteres necessários forem os últimos 21 caracteres antes de uma extensão de ponto e 3 caracteres, você poderá usar um dos seguintes em um script 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

Responder3

Depende da aparência da sua variável em outras instâncias.

Poderia ser tão simples como:

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

ou

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

informação relacionada