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 DMJK
e terminam no final .tgz
:
$ sea2=${sea/*DMJK/DMJK}; echo ${sea2%.tgz}
DMJK.UK.1.0-32133-Z-1
Essa mesma abordagem funciona mesmo se .tgz
nã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'