hvordan kan jeg kommentere / i et afsnit i kildekoden med sed eller awk

I øjeblikket har jeg filer, der indeholder sektioner som denne

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

Hvad jeg vil gøre er at kommentere hvad der er mellem “# BEGIN SOMENAME” og “# END”, så det i sidste ende ser sådan ud

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

Kan jeg opnå dette med awk eller sed? og kan jeg vende det let ?, så bare en operation, som “kommenterer” igen?

Hvad jeg vil undgå for at lave fejl, så hvis linjerne allerede er kommenteret, skal det være alene. Også i “kommentar i” skal det ikke forsøge at gøre noget, hvis linjerne mellem slutning og start ikke starter med et “#”.

Forsøgte det nu i flere timer, ingen succes.

Fundet en mulig solutin:

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

  • måske, fordi denne gamle kode har fejl som flere startlinjer (kopier / indsæt fejl …?) efter den anden, og du skal bare ignorere den første, eller engang begynder starten, og filen slutter …. i ' hellere ikke sende dette script, det er konkurrencedygtigt brudt nu ….
  • du har ret. tilføjede dette til udfordringer. Undskyld blev træt, og det ser altid ud til, at når jeg fandt en delvis løsning, holder alle andre ting op med at arbejde

Svar

Dette script fungerer for mig. Jeg testede det 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 lille ledsagende shell-script:

#!/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 en nyere version, kan du bruge flaget -i i stedet for flytningskonstruktionen i slutningen.)

Kommentarer

  • @Mandragor Hvis SOMENAME i de indledende og afsluttende kommentarer skal matche, så giv mig et råb.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *