首页 > 解决方案 > 如何使用 awk 或 sed 移动 c++ 代码的重复部分和行?

问题描述

我有大量的 C++ 代码,其中包含数千行,如下所示:

   case 14: //OrderSelect
      Execute_OrderSelect();
   break;
   case 15: // OrderGetDouble
      Execute_OrderGetDouble();
   break;
   case 16:   //OrderGetInteger
      Execute_OrderGetInteger();
   break;

我的任务是让它们看起来像这样:

   case 14: Execute_OrderSelect();     break;   // OrderSelect
   case 15: Execute_OrderGetDouble();  break;   // OrderGetDouble
   case 16: Execute_OrderGetInteger(); break;   // OrderGetInteger

请注意,Execute...和 comments 都可以是任何字符串。


我想示意性地我们可以这样写原件:

AAA NN BBB
CCC
DDD

并尝试将其变成:AAA NN CCC DDD BBB.

我尝试过各种sed表达式都没有成功,我能做的最好的就是将 与 结合起来的琐碎操作Execute...()break;但无法移动评论。我在想我为此使用了错误的工具,也许awk会是更好的选择或更易于使用?

以下是一些awk变量:

FNR    The input record number in the current input file.
FS     The input field separator, a space by default.
NF     The number of fields in the current input record.
NR     The total number of input records seen so far.
OFMT   The output format for numbers, "%.6g", by default.
OFS    The output field separator, a space by default.
ORS    The output record separator, by default a newline.
RS     The input record separator, by default a newline.
RT     The  record terminator. Gawk sets RT to the input 
       text that matched the character or regular expression 
       specified by RS.
RSTART The index of the first character matched by match(); 0 if no match

我怎样才能让我的一天更美好?


相关问题:

标签: regexawksed

解决方案


这是骨头,适合按摩;

$ cat tst.awk
/^[[:space:]]*case[[:space:]]/ {
    comment = ""
    if ( match($0,"//") ) {
        comment = substr($0,RSTART)
        $0 = substr($0,1,RSTART-1)
    }

    caseLineNr = 1
}

caseLineNr {
    if ( caseLineNr++ > 1 ) {
        sub(/^[[:space:]]+/,"")
    }
    sub(/[[:space:]]+$/,"")
    printf "%s\t", $0

    if ( /^break[[:space:]]*;/ ) {
        print comment
        caseLineNr = 0
    }
}

$ awk -f tst.awk file
   case 14:     Execute_OrderSelect();  break;  //OrderSelect
   case 15:     Execute_OrderGetDouble();       break;  // OrderGetDouble
   case 16:     Execute_OrderGetInteger();      break;  //OrderGetInteger

推荐阅读