要求sed的正则表达式

问题描述:

的解释,我很难理解以下两个正则表达式的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" 

我真的很感激的详细说明。谢谢!

$$将被取代,以在$ 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