我有一大块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