要求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
/[^/]*$
将匹配后面的一切,但斜线零字面斜杠(/
)或者更多次在行末。
_[^/]*$
将与字面下划线(_
)相匹配,后面跟着一行,但在行尾有零次或多次斜线。
这是第一个,第二个留作练习。
所以“$”只会匹配最后一个字符串“/ ...”,并用空白替换。前面的将保持不变。另外,关于sed中的分隔符,允许使用哪些分隔符?从https://coderwall.com/p/khdkuw/delimiters-in-sed-substitution,它表示“sed可以使用任何字符作为分隔符,事实上,它会自动使用s之后的字符作为分隔符。”这是真的吗? – pepero
我认为一切都允许作为分隔符:'echo“123”| sed's12131'。 '/ [^ /] * $'的行为与dirname相同。从输入字符串中删除基本名称。 – andlrc