我很难理解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"
我非常感谢您的详细解释。谢谢!
答案 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
/[^/]*$
将匹配文字斜杠(/
),后跟除了斜线零点或更多次的所有内容。
_[^/]*$
将匹配文字下划线(_
),后跟除了斜线零点或更多次在行尾。
这是第一次,第二次是作为练习。