我希望将cppclean的输出转换为类似cppcheck的xml部分,这样:
./bit_limits.cpp:25: static data 'bit_limits::max_name_length'
变成:
<error id="static data" msg="bit_limits::max_name_length">
<location file="./bit_limits.cpp" line="25"/>
</error>我一开始是从一个awk开始的:
测试代码:
echo "./bit_limits.cpp:25: static data 'bit_limits::max_name_length'" > test
cat test.out | awk -F ":" '{print "<error id=\""$3"\""}
{print "msg=\""}{for(i=4;i<=NF;++i)print ":"$i}{print "\">"}
{print "<location file=\""$1"\" line=\""$2"\"/>"}
{print "</error>"}'注意:要运行这个命令,您需要将cat命令放回一行--为了便于阅读,我在多行上打印了它。
解释:,我正在使用awk并用冒号":“--它将行分割成有用的块,我试图将这些块构造成XML:
{print "<error id=\""$3"\""} -解压错误ID part{print "msg=\""}{for(i=4;i<=NF;++i)print ":"$i}{print "\">"} -提取消息(替换丢失的冒号,这是所有剩馀的sections{print "<location file=\""$1"\" line=\""$2"\"/>"} -提取文件和行,这部分很容易,因为冒号对齐nicely{print "</error>"} -最后打印结束标记。
这很接近,但不完全正确,它产生了:
<error id=" static data 'bit_limits"
msg="
:
:max_name_length'
">
<location file="./bit_limits.cpp" line="25"/>
</error>id字段应该是“静态数据”,msg字段应该是"'bit_limits::max_name_length'",但除此之外,它是可以的(我不介意它现在被分割成多行--尽管我希望awk没有每次打印新行。
更新( @charlesduffy )指出--对于上下文--我想在bash中这样做,因为我希望将这些代码嵌入到makefile (或者仅仅是一个普通的bash脚本)中,以获得最大的可移植性(即不需要python或其他工具)。
发布于 2019-09-22 17:29:02
可能比需要的要复杂得多:
awk '{
split($1, file_line, ":")
field = 2
while(substr($field, 1, 1) != "'\''") {
id = id " " $field
++field
}
id = substr(id, 2)
while(field <= NF) {
msg = msg " " $field
++field
}
msg = substr(msg, 3, length(msg) - 1)
printf("<error id=\"%s\" msg=\"%s\">\n", id, msg)
printf(" <location file=\"%s\" line=\"%s\">\n", file_line[1], file_line[2])
print "</error>"
}' test.outhttps://stackoverflow.com/questions/58051341
复制相似问题