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