请求解释sed正则表达式

时间:2016-05-12 17:11:12

标签: regex bash sed makefile

我很难理解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"

我非常感谢您的详细解释。谢谢!

1 个答案:

答案 0 :(得分:4)

$$将替换为make文件中的$,因此sed表达式如下所示:

sed -e 's:/[^/]*$::;s:_[^/]*$::g'

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

/[^/]*$将匹配文字斜杠(/),后跟除了斜线零点或更多次的所有内容。

_[^/]*$将匹配文字下划线(_),后跟除了斜线零点或更多次在行尾。

这是第一次,第二次是作为练习。