hoe kan ik commentaar geven op / in een sectie in de broncode met sed of awk

Momenteel heb ik bestanden die secties zoals deze bevatten

code statement1 code statement2 # BEGIN SOMENAME some code some other code # END SOMENAME code statement n +1 code statement n +1 

Wat ik wil doen is commentaar geven op wat er tussen “# BEGIN SOMENAME” en “# END” staat, zodat het er uiteindelijk zo uitziet

code statement1 code statement2 # BEGIN SOMENAME # some code # some other code # END SOMENAME code statement n +1 code statement n +1 

Kan ik dit bereiken met awk of sed? en kan ik het gemakkelijk terugdraaien ?, dus gewoon een bewerking, die “opmerkingen in” weer?

Wat ik wil vermijden om fouten te maken, dus als de regels al zijn becommentarieerd, moet het met rust worden gelaten. Ook in “comment in” zou het niet moeten proberen om iets te doen als de regels tussen einde en begin niet beginnen met een “#”.

Ik heb dat nu enkele uren geprobeerd, geen succes.

Mogelijke oplossing gevonden:

awk " BEGIN { i=0; line_with_no_comment_found=0 } /^# END/ { m=0; if ( line_with_no_comment_found == 1 ) { for (var in a) print "# "a[var] } else { for (var in a) print a[var] } delete a; i=0; line_with_no_comment_found=0; } /^# / { if (m==0) { print } else { a[i++]=$0; } } !/^# / { if (m==0) { print } else { a[i++]=$0; line_with_no_comment_found=1} } /^# BEGIN ([a-zA-Z_])([1-9][0-9]*)*/ {m=1;} END { } "<<EOF 

Reacties

  • misschien, omdat deze oude code heeft zulke fouten meerdere beginregels (kopieer / plak bugs …?) na de andere, en je hoeft alleen de eerste te negeren of soms begint het begin en eindigt het bestand … i ' plaats dit script liever niet, het is nu volledig verbroken ….
  • je hebt gelijk. voegde dit toe aan uitdagingen. Sorry, ik werd moe, en het lijkt erop dat wanneer ik een gedeeltelijke oplossing vond, alle andere dingen niet meer werken

Answer

Dit script werkt voor mij. Ik heb het getest in GNU Awk 4.0.1, maar zou ook in Nawk moeten werken.

awk "BEGIN { # action=0: uncomment # action=1: comment action=0 in_optional_code_block=0 } { if ($0 ~ /^# BEGIN/) { in_optional_code_block=1 } else if ($0 ~ /^# END/) { in_optional_code_block=0 } else if (in_optional_code_block) { if (action) { if ($0 !~ /^#/) { $0 = "# " $0 } } else { if ($0 ~ /^#/) { sub(/^# ?/, "") } } } } 1" 

Ik heb ook een klein bijbehorend shellscript geschreven:

#!/usr/bin/env sh syntax_error() { echo "Usage: `basename \"$0\"` [comment|uncomment] file" >&2 exit 1 } case "$1" in 0|uncomment) action=0; ;; 1|comment) action=1; ;; *) syntax_error; ;; esac shift if [ -z "$@" ]; then syntax_error; fi awk "BEGIN { action="$action" in_optional_code_block=0 } { if ($0 ~ /^# BEGIN/) { in_optional_code_block=1 } else if ($0 ~ /^# END/) { in_optional_code_block=0 } else if (in_optional_code_block) { if (action) { if ($0 !~ /^#/) { $0 = "# " $0 } } else { if ($0 ~ /^#/) { sub(/^# ?/, "") } } } } 1" "$@" > "[email protected]" if [ $? -eq 0 ]; then mv "[email protected]" "$@"; fi 

(Als je GNU Awk 4.1.0 of hoger hebt, kun je de vlag -i gebruiken in plaats van de verplaatsingsconstructie aan het einde.)

Reacties

  • @Mandragor Als SOMENAME in de openings- en slotcommentaar overeen moet komen, geef me dan een seintje.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *