我有几个C源文件,需要更改一种特殊的格式设置功能。在文件的某些部分,
if (x == NULL) {
...
}
需要更改为
if (x == NULL)
{
...
}
我希望使用“缩进”命令,但是它太激进了。它希望使用所有选项更改整个文件。
我想我可以在Perl或什至是Sed中做到这一点,但我也不是很清楚以至于不能解决这个问题。
答案 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>
有人可以确认这是正确的吗?