Extraer una palabra de una cadena en el script de shell


1

Tengo una cadena como $ sea = xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz

y quiero extraer solo 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

Respuestas:


1

Cómo desea elegir qué eliminar y qué conservar no está nada claro. Esta es una de las muchas formas de obtener el resultado que 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

Alternativamente, esto incluye las partes que comienzan con DMJKy dejan la 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

Muchas gracias, tengo que elegir desde DMJK a .tgz
Ajay Gautam

@AjayGautam OK. Agregué una solución que elimina todo antes DMJKy también elimina la final .tgz.
John1024

Lamento molestarlo, soy muy nuevo para la expresión regular y, cómo extraer solo DMJK.UK.1.0-32133-Z-1 xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z- 1 de nuevo para esto tengo que buscar DMJK y xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1 puede ser carpeta
Ajay Gautam

@AjayGautam OK. Actualicé la respuesta para agregar ese ejemplo.
John1024

¿Es posible combinar estas 2 declaraciones en 1 y asignarlas en un verificable, por ejemplo, sea2 = $ {$ {sea / * DMJK / DMJK}%. tgz} Lo intenté, pero no funciona.
Ajay Gautam

0

¿Cómo estás determinando qué personajes extraer? Si los caracteres siempre aparecen en lugares específicos en la cadena, por ejemplo, si es una cadena de longitud fija o los caracteres que necesita son los últimos 21 caracteres antes de una extensión de punto y 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

No hay posiciones no fijas
Ajay Gautam

0

Depende del aspecto de 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'

Pequeña modificación en cuestión: $ sea = xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz matchsadds.dsdsds.21212 o $ sea = xyz-ajay-no-siddhart- ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tar.bz2 matchsadds.dsdsds.21212, necesito extraer el inicio de DMJK y antes de ".tgz" o ".tar", intenté echo $ sea | sed 's #. * (DMJK. *). t * # \ 1 # g', pero fallido o / p debe ser DMJK.UK.1.0-32133-Z-1 en el caso anterior. La cadena puede cambiar al vuelo, por lo que o / p debería ser DMJK.UK.1.3.0-3213309-Z-13
Ajay Gautam

entonces o / p debería ser DMJK.UK.1.3.0-3213309-Z-13, no hay otra cosa
Ajay Gautam
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.