如何使用 sed/awk 替换每个将括号平衡从 0 更改为 1 的左花括号?

如何使用 sed/awk 替换每个将括号平衡从 0 更改为 1 的左花括号?

输入示例:

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是输出记录分隔符,默认为换行符。
  • 代码不在乎关于引用、转义、评论等

相关内容