SED正则贪婪匹配问题:如何匹配首个@符号修正替换结果
修正sed正则匹配首个@符号的问题
原执行的sed命令:
sed -i "" 's/\(.*\)\( @[^@]*\)/path:*\1*\2/' "$OUTPUT_LOCATION"
输入内容:
/Tests/UnitTests/ViewControllers/Test.UnitTest.swift @team1 /Tests/UnitTests/Auth.UnitTest.swift @team2 /Modules/Stuff/ @team1 @team2
错误输出(最后一行*位置错误):
path:*/Tests/UnitTests/ViewControllers/Test.UnitTest.swift* @team1 path:*/Tests/UnitTests/Auth.UnitTest.swift* @team1 path:*/Modules/Stuff/ @team1* @team2
修正后的命令
sed -i "" 's/\([^@]*\)\( @.*\)/path:*\1*\2/' "$OUTPUT_LOCATION"
修正逻辑
原正则中的.*是贪婪匹配,会尽可能匹配到最后一个 @前的所有内容,导致最后一行中\1错误捕获了/Modules/Stuff/ @team1,最终*被插在@team1之后。
修正后的正则用[^@]*替代.*,[^@]*会精准匹配首个@符号之前的所有字符(路径部分不含@),确保\1只捕获路径内容,\2捕获从首个 @开始的所有后续内容,让*正确包裹路径部分。
正确输出
path:*/Tests/UnitTests/ViewControllers/Test.UnitTest.swift* @team1 path:*/Tests/UnitTests/Auth.UnitTest.swift* @team1 path:*/Modules/Stuff/* @team1 @team2
内容的提问来源于stack exchange,提问作者Kwoner
相关产品推荐
相关产品推荐

