Extraer una palabra de una cadena en un script de shell

Extraer una palabra de una cadena en un script de shell

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 DMJKy 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 .tgzno 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'

información relacionada