在sed中更换块

时间:2009-05-20 06:20:49

标签: sed

我正在尝试使用sed替换文件中的块,但没有成功。

E.g。 我想替换它:

for(int i = 0; i < MAX_LOOPS; ++i) {
    printf("Hello World!");
}

有了这个:

int i = 0;
while(i < MAX_LOOPS) {
    printf("Hello World!");
    ++i;
}

4 个答案:

答案 0 :(得分:1)

以下将以非常基本的方式进行操作,即它不健壮,也不担心格式化。

s / for(int i = 0; i&lt; MAX_LOOPS; ++ i)/ int i = 0; \ nwhile(i&lt; MAX_LOOPS)/ g   / printf(“Hello World!”); / {   一个++ I;   }

这只是一个快速的黑客,但它应该足以让你去。 Sed可能不是这项工作的最佳工具,但知道如何在Sed中做到这一点并没有什么坏处。

答案 1 :(得分:0)

这可能对您有用:

sed -e '/^for.* {/,/^}/{/for/{i\int i = 0;'\
>   -e ';c\while(i < MAX_LOOPS) {'\
>   -e '}};/^}/i\++i'  file
int i = 0;
while(i < MAX_LOOPS) {
    printf("Hello World!");
++i
}

答案 2 :(得分:0)

sed -r '
    /for\s*\(.*;.*;.*\)/!b
    s#.*\((.*);(.*);(.*)\).*#\1\nwhile (\2) {\a\3#
    h
    s/.*\a//
    x
    s/\a.*//
    :X
    N
    /}/!{bX}
    G
    s#(.*)\n(.*)\n(.*)#\1\n   \3\n\2#
' file

int i = 0
while ( i < MAX_LOOPS) {
    printf("Hello World!");
    ++i
}

答案 3 :(得分:0)

sed -e '
   /for(int i = 0; i < MAX_LOOPS; ++i) {/,/}/ {
      /}/ a \
int i = 0;\
while(i < MAX_LOOPS) {\
    printf("Hello World!");\
    ++i;\
}
      d
      }
   '  YourFile
  • 删除之间的所有行(int i = 0; i&lt; MAX_LOOPS; ++ i){}
  • 到达} 时附加新内容(在删除输入行之前。

它使用输入和ouptut之间的不同行为。将发送信息附加到输出而不将此信息放入当前工作缓冲区(通过输入和模拟提供),因此删除不能触摸此信息,但输入(此处的当前行} )被很好地触摸