sed - 如何使用sed进行正则表达式组

She*_*jie 37 regex linux sed

无论如何你可以使用sed像java正则表达式模式/匹配/组一样做正则表达式匹配组吗?

如果我有字符串

test-artifact-201251-balbal-0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)

我如何使用sed只是为了得到如下结果:

test-artifact-0.1-SNASHOT.jar
Run Code Online (Sandbox Code Playgroud)

我想知道sed允许你做一些像java正则表达式的东西,你定义的模式如下:

([a-z]*-[a-z]*-)([0-9]*-)([a-z]*-)([.]*SNAPSHOT.jar)
Run Code Online (Sandbox Code Playgroud)

然后你可以得到如下数组的结果:

test-artifact-
201251-
balbal-
0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)

Bir*_*rei 59

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

\([a-z]*-[a-z]*-\)\([0-9]*-\)\([a-z]*-\)\([.]*SNAPSHOT.jar\)
Run Code Online (Sandbox Code Playgroud)

并与使用它们\1,\2等等.


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

  • 使用GNU`sed',您可以通过使用扩展正则表达式来避免所有转义括号.使用`-r`开关执行此操作. (19认同)
  • `-E` 在 GNU 中也适用,不需要转义括号。 (4认同)

Ste*_*eve 16

这就是Birei和Thor的意思:

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

输出:

test-artifact-
201251-
balbal-
0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)


Ken*_*ent 6

对于那些常规字符串,awk可以帮助您避免分组.:)

你只需给出你想要的零件索引编号:

awk 'BEGIN{FS=OFS="-"}{print $1,$2,$5,$6}' 
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)