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

참고, 모두 것을 실행 ... 및 의견은 어떤 문자열이 될 수 있습니다.


나는 개략적으로 다음과 같이 원본을 작성할 수 있다고 가정합니다.

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 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