【问题标题】:Block replacement in sedsed 中的块替换
【发布时间】:2010-10-27 13:12:30
【问题描述】:

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

例如 我想替换这个:

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

有了这个:

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

【问题讨论】:

  • 为什么你更喜欢使用 while 而不是 for?对我来说,这似乎是可读性和可维护性的巨大降级。
  • 这里的困难是需要在 while() {} 循环中满足什么 - 如果它只是一个简单的指令是一回事,但如果它是嵌套块等,那就是另一个.

标签: sed


【解决方案1】:
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 和 } 之间的所有行
  • 到达时}追加新内容(在删除输入行之前。

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

【讨论】:

    【解决方案2】:
    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】:

      这可能对你有用:

      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
      }
      

      【讨论】:

        【解决方案4】:

        以下方法可以解决问题,但以一种非常基本的方式,即它不健壮,也不担心格式化。

        s/for(int i = 0; i

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

        【讨论】:

          猜你喜欢
          • 2012-10-14
          • 2010-11-24
          • 2020-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多