首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash提取字符串段并存储在变量中

bash提取字符串段并存储在变量中
EN

Stack Overflow用户
提问于 2019-09-22 16:42:50
回答 1查看 204关注 0票数 4

我希望将cppclean的输出转换为类似cppcheck的xml部分,这样:

./bit_limits.cpp:25: static data 'bit_limits::max_name_length'

变成:

代码语言:javascript
复制
<error id="static data" msg="bit_limits::max_name_length">
    <location file="./bit_limits.cpp" line="25"/>
</error>

我一开始是从一个awk开始的:

测试代码:

代码语言:javascript
复制
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>"} -最后打印结束标记

这很接近,但不完全正确,它产生了:

代码语言:javascript
复制
<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或其他工具)。

EN

回答 1

Stack Overflow用户

发布于 2019-09-22 17:29:02

可能比需要的要复杂得多:

代码语言:javascript
复制
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.out
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58051341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档