Perl单行命令组合匹配输出异常求助:同时打印对象文件与链接库
问题:转换Make输出文本格式
输入的Make输出每行示例:
hello there -o one two three four -labc -lfoo -lbar something useless -o abc doo zoo -lkoo -lfoo -lmoo
期望转换为每行两列的格式:第一列是-o后的所有对象文件,第二列是-l后的所有链接库(去掉-l前缀),用逗号分隔:
one two three four, abc foo bar abc doo zoo, koo foo moo
原Perl单行命令组合执行时对象文件输出异常:
perl -ne '/-o(.*?)-/m; @libs = /-l([^ ]+)/gs; printf "%s %s\n", $1 , join(", ", @libs);' inputfile
修正后的命令
perl -ne '/-o\s*(.*?)(?=\s+-|$)/; $objs = $1; $objs =~ s/^\s+|\s+$//; @libs = /-l(\S+)/g; print "$objs, ", join(" ", @libs), "\n"' inputfile
问题原因说明
原正则
/-o(.*?)-/m的缺陷:- 非贪婪匹配
.*?会捕获到第一个-为止,而这个-是后续-l选项的开头,导致$1末尾带有多余空格 - 如果
-o是该行最后一个选项(无后续-开头的参数),这个正则会匹配失败,$1为空
- 非贪婪匹配
修正点:
- 用正向预查
(?=\s+-|$)匹配-o后直到下一个-开头的参数或行尾的内容,确保完整捕获所有对象文件 - 用
$objs =~ s/^\s+|\s+$//去除对象文件字符串首尾的多余空格 - 链接库匹配
/-l(\S+)/g简化为匹配-l后的非空白字符,结果更准确
- 用正向预查
内容的提问来源于stack exchange,提问作者monk
相关产品推荐
相关产品推荐

