如何使用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

请注意,执行和注释可以是任何字符串。


我想,从原理上讲,我们可以这样写原稿:

AAA NN BBB
CCC
DDD

并尝试将其转化为:CCD_ 1。

我尝试过使用各种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

我怎样才能让我的一天更明亮?


相关问题:

  • 粘贴非相邻行的AWK或sed方法
  • 使用sed更改文件中一行的位置
  • 如何在awk/sed可能多次出现的两个标记图案之间选择线条

这是骨头,按需按摩;

$ 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 "%st", $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

相关内容

最新更新