2012-07-25 31 views
32

tun Gibt es sowieso Sie können Regex Match-Gruppe mit sed wie Java Regex Muster/Spiel/Gruppe?sed - wie Regex-Gruppen mit sed

wenn ich Zeichenfolge wie

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

wie kann ich sed verwenden nur das Ergebnis erhalten wie:

test-artifact-0.1-SNASHOT.jar 

Ich frage mich, tut sed können Sie so etwas wie Java Regex tun, Sie definieren das Muster wie:

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

und dann können Sie die Ergebnisse als ein Array wie erhalten:

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

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

Antwort

55

Sie haben Klammern gruppieren Ausdrücke zu entkommen:

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

und nutzen sie mit \1, \2 usw.


EDIT: Auch nur beachten, bevor SNAPSHOT dass wird nicht übereinstimmen. In Klammern . ist literal. Es sollte [0-9.-]*

+18

Mit GNU 'sed' können Sie alle ausgehenden Klammern vermeiden, indem Sie erweiterte reguläre Ausdrücke verwenden. Verwenden Sie dazu den Schalter '-r'. – Thor

+0

'-E' funktioniert auch in GNU, um Parens nicht zu entkommen. – abalter

15

sein Dies ist, was Birei und Thor bedeuten:

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

Ausgang:

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

infact für diejenigen regulären String, awk Sie Gruppierung retten konnte. :)

Sie nur den Teil Indexnummer geben Sie wollen:

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

Ausgang:

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

Wenn Sie einen einfacheren Weg suchen Ich denke, das Ihre Hilfe sein könnte! :)

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

"-" verwendet, wie delimeter und Felder 1,2,5,6 gedruckt werden.

Hinweis: Dies würde erfordern, dass Sie die genaue Position des Feldes kennen.