使用sed,如何在C函数的开头插入一行 - 关闭paren,换行符,打开大括号

时间:2016-01-14 17:54:24

标签: c sed

我想在几个格式相同的C函数的开头插入一行。我怀疑sed是这样做的方式,但我有限的sed知识。感谢。

ORDER BY a.Date, p.title

2 个答案:

答案 0 :(得分:2)

如果函数的开头括号从第一列开始,如果它们是第一列中的唯一大括号(即,如果在行的末尾放置结构和枚举的开括号),则可以使用:

sed -e 's/^{/{\n    MYNEWLINE;/g' orig.c > edited.c

这似乎适用于快速测试,但通常的警告和免责声明适用。

编辑:正如评论中所指出的,不仅函数在第一列中有大括号,因此需要一些上下文。我们可以使用70年代的另一种工具,awk:

awk 'BEGIN {split("typedef union struct enum", a); \
    for (i in a) skip[a[i]] = 1;}; \
    {print; if (/^{/ && !(last in skip)) print "    MYFIRSTLINE();"; \
    if (NF > 0) last = $1; }' orig.c > edited.c

理论上这是一个单行,但在单独的文件中可能更好,比如说first.awk

#!/usr/bin/awk -f

BEGIN {
    split("typedef union struct enum", a);
    for (i in a) skip[a[i]] = 1;
};

{
    print;
    if (/^{/ && !(last in skip))
        print "    MYFIRSTLINE();";
    if (NF > 0) last = $1;
}

然后你可以用

调用脚本
awk -f first.awk orig.c > edited.c

或者,chmod执行权限后

first.awk orig.c > edited.c

当然,同样的策略:

  • 打印每一行;
  • 当第一列中有大括号且上下文不是类型或变量定义时,打印其他内容;
  • 保存第一个单词以确定下一行的上下文

也可以用任何其他脚本语言实现。

答案 1 :(得分:0)

对于这样简单的规则,程序几乎太复杂了。你在标题关闭paren,换行符,打开大括号中说。你想做什么:

if testfunction(val)
{

它遵循标准但不是函数定义。

话虽如此,下面的sedscript应该可以解决问题,它甚至关心{

周围的可选标签或空格
/)[ \t\r]*$/ {
n
s/^[ \t]*}[ \t\r]*$/&/
t add
b end
:add
a\
\

end
}

用英文写的:

  • 寻找以右paren结尾的行
  • 看下一行
  • 尝试替换仅包含开口花括号(除了空格)的行
  • 如果匹配替换添加空行