输入示例:
void C::foo()
{ // <- this changes bracket balance from 0 to 1
if (true)
{ // balance is 2 after we process this bracket
...
} // now it is 1 again
} // now bracket balance is zero again, so next opening brace will be
// subsituted
输出
void C::foo()
{ PROCESSED;
if (true)
{
...
}
}
我有 sed 和 awk 供我使用。目前,我知道如何以非常通用的方式进行替换,这要感谢这里的答案如何在 bash 中编辑多行模式(可使用 sed 和 awk),但我不知道如何捕捉所描述的花括号。
答案1
awk -F "" '{
for (i=1;i<=NF;i++) {
if ($i == "}" && count > 0) count--
if ($i == "{" ) if (count++ == 0) $i="{ PROCESSED;"
printf "%s", $i
}
printf "%s", ORS
}'
我用了这种方法逐个字符地解析每一行。
笔记:
- 逻辑不允许
count
达到负值。 (count++ == 0)
count
相比之下增加了0
。ORS
是输出记录分隔符,默认为换行符。- 代码不在乎关于引用、转义、评论等