2012-07-25 66 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被打印。

注意:這將要求您知道該字段的確切位置。