50

无论如何你可以使用像java regex pattern/match/group这样的sed来做正则表达式匹配组吗?

如果我有类似的字符串

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

我如何使用 sed 来获得如下结果:

test-artifact-0.1-SNASHOT.jar

我想知道 sed 是否允许您执行 java regex 之类的操作,您可以定义如下模式:

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

然后您可以将结果作为数组获取,例如:

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

4 回答 4

73

您必须将括号转义为组表达式:

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

并将它们与\1,\2等一起使用。


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

于 2012-07-25T13:46:09.250 回答
21

这就是Birei和Thor的意思:

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
于 2012-07-25T13:59:44.143 回答
7

事实上,对于那些常规字符串,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
于 2012-07-25T14:05:09.283 回答
2

如果您正在寻找一种更简单的方法,我想这可能会对您有所帮助!:)

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

“-”用作分隔符,并打印字段 1、2、5、6。

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

于 2016-09-27T19:10:13.430 回答