将C代码中的左花括号移到下一行?

时间:2019-05-31 17:03:23

标签: c perl sed indentation

我有几个C源文件,需要更改一种特殊的格式设置功能。在文件的某些部分,

if (x == NULL) {
    ...
}

需要更改为

if (x == NULL)
{
    ...
}

我希望使用“缩进”命令,但是它太激进了。它希望使用所有选项更改整个文件。

我想我可以在Perl或什至是Sed中做到这一点,但我也不是很清楚以至于不能解决这个问题。

2 个答案:

答案 0 :(得分:2)

这怎么了?

$ cat tst.c
#include "stdio.h"

int
main ()
{
    void *x;

    if (x == NULL) {
        printf("darn\n");
    }

    return 0;
}

$ indent -i 4 -bli 0 -npcs -st tst.c
#include "stdio.h"

int
main()
{
    void *x;

    if (x == NULL)
    {
        printf("darn\n");
    }

    return 0;
}

如果您还有其他不应更改的代码段示例,请创建一个包含这些代码段的示例程序,并调整indent选项,直到您对输出的代码风格满意为止感到满意想要。


在评论@melpomene had mentioned中,indent并不总是正确地处理混淆的代码,并给出了prin\<newline>tf("...")的示例。 idk关于其他情况,但是您可以在sed和gcc的帮助下通过预处理来处理该情况:

$ cat tst.c
#include "stdio.h"

int
main ()
{
    void *x;

    // here is a comment
    if (x == NULL) {
        prin\
tf("darn\n");
    }

    return 0;
}

$ indent -i 4 -bli 0 -npcs -st tst.c
#include "stdio.h"

int
main()
{
    void *x;

    // here is a comment
    if (x == NULL)
    {
        prin tf("darn\n");
    }

    return 0;
}

$ sed 's/a/aA/g;s/__/aB/g;s/#/aC/g' tst.c |
    gcc -CC -P -traditional-cpp -E - |
    sed 's/aC/#/g;s/aB/__/g;s/aA/a/g'
#include "stdio.h"

int
main ()
{
    void *x;

    // here is a comment
    if (x == NULL) {
        printf("darn\n");
    }

    return 0;
}

$ sed 's/a/aA/g;s/__/aB/g;s/#/aC/g' tst.c |
    gcc -CC -P -traditional-cpp -E - |
    sed 's/aC/#/g;s/aB/__/g;s/aA/a/g' |
    indent -i 4 -bli 0 -npcs -st
#include "stdio.h"

int
main()
{
    void *x;

    // here is a comment
    if (x == NULL)
    {
        printf("darn\n");
    }

    return 0;
}

答案 1 :(得分:0)

看起来今天是我的幸运日,看来我已经知道了:

sed 's/^\([ ]*\)\(if (.* == NULL)\) {$/\1\2\n\1{/g' <filename>

有人可以确认这是正确的吗?