Siguiente es el contenido de un archivo:

xxx_component1-1.0-2-2acd314.xc-linux-x86-64-Release-devel.r
xxx_component2-3.0-1-fg3sdhd.xc-linux-x86-64-Release-devel.r
xxx_component3-1.0-2-3gsjcgd.xc-linux-x86-64-Release-devel.r
xxx_component4-0.0-2-2acd314.xc-linux-x86-64-Release-devel.r

Quiero extraer los nombres de los componentes componente1 component2 etc.

Esto es lo que he intentado:

for line in `sed -n -e '/^xxx-/p' $file`
do
    comp=`echo $line | sed  -e '/xxx-/,/[0-9]/p'`
    echo "comp - $comp"
done

También traté de sed -e 's/.*xxx-\(.*\)[^0-9].*/\1/'

Esto se basa en algo de información en la red. Por favor, dame sed comando y, si es posible explicar paso a paso

Parte 2. Yo también la necesidad de extraer el número de versión de la cadena.
número de versión comienza con el dígito y termina con . seguido por xc-linux.
Como se puede observar, para mantener la singularidad de su ha aleatoria de caracteres alfanuméricos ( longitud es de 7) como parte del número de la versión.

Por ejemplo :
xxx_component1-1.0-2-2acd314.xc-linux-x86-64-Release-devel.r
En esta cadena el número de versión es : 1.0-2-2acd314

InformationsquelleAutor user3662599 | 2014-05-21

1 Comentario

  1. 15

    Hay muy pocas maneras de extraer los datos. La forma más sencilla sería grep.

    GNU grep:

    Usted puede tomar los datos necesarios por medio de GNU grep con PCRE opción -P:

    $ cat file
    xxx_component1-1.0-2-2acd314.xc-linux-x86-64-Release-devel.r
    xxx_component2-3.0-1-fg3sdhd.xc-linux-x86-64-Release-devel.r
    xxx_component3-1.0-2-3gsjcgd.xc-linux-x86-64-Release-devel.r
    xxx_component4-0.0-2-2acd314.xc-linux-x86-64-Release-devel.r
    

    $ grep -oP '(?<=_)[^-]*' file
    component1
    component2
    component3
    component4
    

    Aquí se utiliza negativo mirar detrás de la afirmación de decirle a capturar todo, desde _ a un - no incusive.


    awk:

    $ awk -F"[_-]" '{print $2}' file
    component1
    component2
    component3
    component4
    

    Aquí le decimos a awk utilizar - y _ como delimitadores y la impresión de la segunda columna.


    sed:

    Habiendo dicho eso, también se puede utilizar sed para extraer los datos necesarios por medio de grupo de captura:

    $ sed 's/.*_\([^-]*\)-.*//' file
    component1
    component2
    component3
    component4
    

    El regex estados que coincide con cualquier carácter de cero o más veces, hasta un _. A partir de ese momento, la captura de todo hasta un - en un grupo. En la parte de reemplazo sólo tiene que utilizar los datos capturados en el grupo por llamarlo de uso de referencia, que es \1.

    • Gracias Jaypal. Hice pocas modificaciones en su sed uno y parece cubrir todos los casos de uso: Esto es lo que hice: sed ‘s/xxx_([^-][^0-9]*)-.*/\1/’ archivo
    • Estoy aquí de nuevo con otra duda sobre el mismo patrón. lo que Si quiero que esta parte del patrón de 1.0-2-2acd314 ( versión no). Vamos por los de arriba xplaination este debe tener realizaciones sed s/*-[0-9].\(^.xc-*\)-.*/\1/'
    • Si usted puede actualizar a la pregunta con todos los escenarios posibles, entonces yo puedo tratar de dar una solución genérica que el trabajo para todos ellos.
    • En la pregunta original de la cadena xxx_component1-1.0-2-2acd314.xc-linux-x86-64-Release-devel.r ¿Cómo puedo obtener el número de versión que es 1.0-2-2acd314 .

Dejar respuesta

Please enter your comment!
Please enter your name here