2016-05-12 120 views
0

的解釋,我很難理解以下兩個正則表達式的sed在makefile:要求sed的正則表達式

sw_version:=software/module/1.11.0 

sw:= $(shell echo $(sw_version) | sed -e 's:/[^/]*$$::;s:_[^/]*$$::g') 
// sw is "software/module" 

version:= $(shell echo $(sw_version) | sed -e 's:.*/::g;s/-.*$$//') 
// version is "1.11.0" 

我真的很感激的詳細說明。謝謝!

回答

4

$$將被取代,以在$ make文件,所以sed的表達看起來像這樣:

​​

s///是替換命令。而分隔符並不需要在你的情況/這是一個冒號(:):

s:/[^/]*$::; 
s:_[^/]*$::g 

它與匹配模式,並與替換替換:

s/pattern/replacement/ 

;是使用一個分隔符將同一個調用中的命令乘以sed。

所以基本上這是兩個替代品替代/[^/]*$另一個替代品_[^/]*$

[...]是一個字符類,它將匹配你曾經在那裏粘一次。例如:[abc]將匹配a或b或c。如果^在課程開始時會匹配所有內容,但該課程中的內容除外,例如:[^abc]將匹配除a和b和c之外的所有內容。

*將重複最後一次模式零次或多次。

$是行結束

讓應用我們知道上面的例子(閱讀自下而上):

s:/[^/]*$::; 
#^^^^^ ^^ ^^ 
#||||| || |Delimiter 
#||||| || Replace with nothing 
#||||| |End of line 
#||||| Zero or more times 
#||||Literal slash 
#|||Match everything but ... 
#||Character class 
#|Literal slash 
#Delimiter used for the substitution command 

/[^/]*$將匹配後面的一切,但斜線零字面斜槓(/)或者更多次在行末。

_[^/]*$將與字面下劃線(_)相匹配,後面跟着一行,但在行尾有零次或多次斜線。

這是第一個,第二個留作練習。

+0

所以「$」只會匹配最後一個字符串「/ ...」,並用空白替換。前面的將保持不變。另外,關於sed中的分隔符,允許使用哪些分隔符?從https://coderwall.com/p/khdkuw/delimiters-in-sed-substitution,它表示「sed可以使用任何字符作爲分隔符,事實上,它會自動使用s之後的字符作爲分隔符。」這是真的嗎? – pepero

+0

我認爲一切都允許作爲分隔符:'echo「123」| sed's12131'。 '/ [^ /] * $'的行爲與dirname相同。從輸入字符串中刪除基本名稱。 – andlrc