2012-07-25 49 views
32

是否有无论如何你可以做正则表达式匹配组使用sed像java正则表达式模式/匹配/组?sed - 如何做正则表达式组使用sed

如果我有串状

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

我怎么用sed只是为了得到这样的结果:

test-artifact-0.1-SNASHOT.jar 

我想知道做的sed允许你做的东西像Java正则表达式,你这样定义的模式:

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

,然后你可以得到的结果作为数组一样:

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

http://stackoverflow.com/questions/2777579/how-to-output-only-captured-groups-with-sed – 2015-10-07 13:42:10

回答

55

你要逃避括号组表达式:

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

而且随着\1\2使用它们,等


编辑:也只是SNAPSHOT前注意[.]不匹配。括号内为.是文字。它应该是[0-9.-]*

+18

使用GNU'sed',您可以通过使用扩展正则表达式来避免所有转义的括号。使用'-r'开关来做到这一点。 – Thor 2012-07-25 13:59:34

+0

'-E'也可以在GNU中工作,不需要转义parens。 – abalter 2016-10-14 17:11:52

15

这是Birei和雷神的意思是:

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

输出:

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

INFACT对于那些经常串,AWK可以节省您的分组。 :)

你只要给你想要的部分索引号:

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

输出:

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

如果你正在寻找一个更简单的方法我想这可能是你的帮助! :)

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

用作分隔符 的“ - ”和字段1,2,5,6被打印。

注意:这将要求您知道该字段的确切位置。