awkまたはsedを使用してc ++コードの繰り返される部分と行を移動する方法は?
Nov 25 2020
私は次のような数千行の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
どうすれば私の一日を明るくすることができますか?
関連する質問:
- 隣接していない行を貼り付けるAWKまたはsedの方法
- sedを使用してファイル内の行の位置を変更する
- awk / sedで複数回発生する可能性のある2つのマーカーパターン間の線を選択する方法
回答
2 EdMorton Nov 25 2020 at 05:34
これが骨です、それに合わせてマッサージしてください。
$ 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