sed中的块替换

sed中的块替换,sed,Sed,我试图用sed替换文件中的一个块,但没有成功 例如。 我想替换这个: for(int i = 0; i < MAX_LOOPS; ++i) { printf("Hello World!"); } for(int i=0;i

我试图用sed替换文件中的一个块,但没有成功

例如。 我想替换这个:

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

int i = 0;
while(i < MAX_LOOPS) {
    printf("Hello World!");
    ++i;
}
inti=0;
while(i
下面的方法可以实现这一点,但非常基本,即它既不健壮,也不担心格式问题

s/for(int i=0;i
这只是一个快速的攻击,但它应该足以让你去。Sed可能不是这项工作的最佳工具,但知道如何在Sed中完成这项工作并没有坏处。

这可能适合您:

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
}
sed-e'/^for.*{/,/^}/{/for/{i\int i=0;'\
>-e';c\while(i-e'}};/^}/i\++i'文件
int i=0;
while(i
sed-r'
/对于\s*\(*;*;*\)/!B
当(\2){\a\3#
H
s/*\a//
x
s/\a*//
:X
N
/}/!{bX}
G
s#(.*)\n(.*)\n(.*)\1\n\3\n\2#
"档案"
int i=0
while(i
sed-e'
/对于(int i=0;i
  • 删除(int i=0;i
  • 到达时}追加新内容(在删除输入行之前)

它在输入和输出之间使用不同的行为。将发送信息附加到输出,而不将此信息放入当前工作缓冲区(按输入和moification馈送),因此delete不能触摸此信息,但要触摸输入(此处为当前行})非常感动

为什么您更喜欢使用while而不是for?对我来说,这似乎是可读性和可维护性方面的一个巨大降级。这里的困难是while(){}循环中需要满足的内容-如果它只是一条简单的指令,这是一回事,但如果它是嵌套块等,则这是另一回事。
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
}
sed -e '
   /for(int i = 0; i < MAX_LOOPS; ++i) {/,/}/ {
      /}/ a \
int i = 0;\
while(i < MAX_LOOPS) {\
    printf("Hello World!");\
    ++i;\
}
      d
      }
   '  YourFile