2

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

例如我想替换这个:

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

有了这个:

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

4 回答 4

1

以下将做的伎俩,但以一种非常基本的方式,即它不健壮,也不担心格式化。

s/for(int i = 0; i < MAX_LOOPS; ++i)/int i = 0;\nwhile(i < MAX_LOOPS)/g /printf("Hello World!");/{ a++i; }

这只是一个快速的技巧,但它应该足以让你继续前进。Sed 可能不是完成这项工作的最佳工具,但知道如何在 Sed 中完成它并没有什么坏处。

于 2009-05-23T14:27:21.343 回答
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
}
于 2011-12-13T01:29:30.930 回答
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
}
于 2017-01-23T13:29:35.153 回答
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
  • 删除for(int i = 0; i < MAX_LOOPS; ++i) {}之间的所有行
  • 到达 }时追加新内容(在删除输入行之前。

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

于 2017-01-23T13:51:08.970 回答