hvordan kan jeg kommentere / i en seksjon i kildekoden med sed eller awk

For øyeblikket har jeg filer som inneholder seksjoner som dette

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

Det jeg vil gjøre er å kommentere hva som er mellom «# BEGIN SOMENAME» og «# END», slik at det til slutt ser slik ut

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

Kan jeg oppnå dette med awk eller sed? og kan jeg reversere det enkelt ?, så bare en operasjon, som «kommenterer» igjen?

Det jeg vil unngå for å gjøre feil, så hvis linjene allerede er kommentert, bør det være i fred. Også i «kommentar i» skal det ikke prøve å gjøre noe hvis linjene mellom slutt og begynn ikke begynner med et «#».

Prøvde det nå i flere timer, ingen suksess.

Fant en mulig løsning:

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 

Kommentarer

  • kanskje, fordi denne gamle koden har feil som flere startlinjer (kopier / lim inn feil …?) etter hverandre, og du trenger bare å ignorere den første, eller en gang begynner starten og filen slutter …. i ' Jeg vil helst ikke legge ut dette skriptet, det er ødelagt nå …
  • du har rett. la dette til utfordringer. Beklager ble sliten, og det virker alltid når jeg fant en delvis løsning, alle andre ting slutter å fungere

Svar

Dette skriptet fungerer for meg. Jeg testet den i GNU Awk 4.0.1, men skulle også fungere i Nawk.

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" 

Jeg skrev også et lite tilhørende skallskript:

#!/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 

(Hvis du har GNU Awk 4.1.0 eller nyere, kan du bruke flagget -i i stedet for trekkkonstruksjonen på slutten.)

Kommentarer

  • @Mandragor Hvis SOMENAME i innledende og avsluttende kommentar må stemme overens, gi meg et rop.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *