Tengo una cadena como $sea = xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz
y quiero extraer sólo DMJK.UK.1.0-32133-Z-1 y la cadena de búsqueda será DMJK
lo intenté como
echo $sea
y=${sea/\/*\//};
echo ${y/.*/};
pero no funciona por favor ayuda
Respuesta1
No está del todo claro cómo desea elegir qué eliminar y qué conservar. Esta es una de las muchas formas de obtener el resultado que pides:
$ 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
Alternativamente, esto incluye las partes que comienzan DMJK
y terminan con el final .tgz
:
$ sea2=${sea/*DMJK/DMJK}; echo ${sea2%.tgz}
DMJK.UK.1.0-32133-Z-1
Este mismo enfoque funciona incluso si .tgz
no está 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
Respuesta2
¿Cómo determinas qué personajes extraer? Si los caracteres siempre aparecen en lugares específicos de la cadena, por ejemplo, si es una cadena de longitud fija o los caracteres que necesita son los últimos 21 caracteres antes de un punto y una extensión de 3 caracteres, puede usar uno de los siguientes en un 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
Respuesta3
Depende de cómo se vea su variable en otros casos.
Podría ser tan simple como:
echo $sea | cut -d '-' -f 7- | cut -d . -f -4
o
echo $sea | sed 's#.*\(DMJK.*\).tgz#\1#g'