2012-07-25 14 views
32

¿Hay algún grupo de coincidencia de expresiones regulares que pueda usar sed como java regex pattern/match/group?sed - cómo hacer grupos regex usando sed

si tengo cadena como

test-artifact-201251-balbal-0.1-SNAPSHOT.jar 

cómo se utiliza sed sólo para obtener el resultado como:

test-artifact-0.1-SNASHOT.jar 

Me pregunto qué sed le permiten hacer algo así como expresiones regulares Java, definir el patrón como:

([a-z]*-[a-z]*-)([0-9]*-)([a-z]*-)([.]*SNAPSHOT.jar) 

y entonces se puede obtener los resultados como una matriz como:

test-artifact- 
201251- 
balbal- 
0.1-SNAPSHOT.jar 
+0

http://stackoverflow.com/questions/2777579/how-to-output-only-captured-groups-with -sed –

Respuesta

55

tienes que escapar paréntesis para agrupar expresiones:

\([a-z]*-[a-z]*-\)\([0-9]*-\)\([a-z]*-\)\([.]*SNAPSHOT.jar\) 

y utilizarlos con \1, \2, etc.


EDITAR: También tenga en cuenta justo antes de que SNAPSHOT[.] no coincidirá. Los corchetes interiores . son literales. Debe ser [0-9.-]*

+18

Con GNU 'sed' puede evitar todos los paréntesis escapados mediante el uso de expresiones regulares extendidas. Use el interruptor '-r' para hacer esto. – Thor

+0

'-E' también funciona en GNU para no tener que escapar de los paréntesis. – abalter

15

Esto es lo que Birei y Thor se refiere a:

sed -r "s/([a-z]*-[a-z]*-)([0-9]*-)([a-z]*-)(.*)/\1\n\2\n\3\n\4/" 

Salida:

test-artifact- 
201251- 
balbal- 
0.1-SNAPSHOT.jar 
6

de hecho para aquellos cadena normal, awk podría ahorrarle de la agrupación. :)

que acaba de dar el número de índice parte que desea:

awk 'BEGIN{FS=OFS="-"}{print $1,$2,$5,$6}' 

de salida:

kent$ echo "test-artifact-201251-balbal-0.1-SNAPSHOT.jar"|awk 'BEGIN{FS="-";OFS="-"}{print $1,$2,$5,$6}' 
test-artifact-0.1-SNAPSHOT.jar 
2

Si usted está buscando una manera más fácil que supongo que esto podría ser de su ayuda! :)

echo "est-artifact-201251-balbal-0.1-SNAPSHOT.jar" | cut -d- -f1,2,5,6 

"-" que se utiliza como delimitador y campos 1,2,5,6 están impresos.

Nota: Esto requerirá que conozca la posición exacta del campo.