我想在几个格式相同的C函数的开头插入一行。我怀疑sed是这样做的方式,但我有限的sed知识。感谢。
ORDER BY a.Date, p.title
答案 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
}
用英文写的: