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 ... और टिप्पणियाँ किसी भी स्ट्रिंग हो सकती हैं।


मुझे लगता है कि योजनाबद्ध रूप से हम इस तरह से मूल लिख सकते हैं:

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