cum pot să comentez / într-o secțiune din codul sursă cu sed sau awk

În prezent am fișiere, care conțin secțiuni de acest gen

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

Ceea ce vreau să fac este să comentez ce este între „# BEGIN SOMENAME” și „# END”, astfel încât, în final, să arate așa

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

Pot realiza acest lucru cu awk sau sed? și îl pot inversa cu ușurință ?, deci doar o operație, care „comentează” din nou?

Ce vreau să evit pentru a face greșeli, așa că dacă liniile sunt deja comentate, ar trebui lăsat în pace. De asemenea, în „comentează în” nu ar trebui să încerce să facă ceva dacă liniile dintre sfârșit și început nu încep cu un „#”.

Am încercat acum câteva ore, fără succes.

Am găsit o posibilă soluție:

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 

Comentarii

  • poate, deoarece acest vechi cod are greșeli de genul mai multor linii de început (copiere / lipire erori …?) după alta, și trebuie doar să ignorați prima sau când începe începe și fișierul se termină …. i ' preferați să nu postați acest script, acum este întrerupt …
  • aveți dreptate. a adăugat acest lucru provocărilor. Ne pare rău, am obosit și se pare că întotdeauna când am găsit o soluție parțială, toate celelalte lucruri nu mai funcționează

Răspuns

Acest script funcționează pentru mine. L-am testat în GNU Awk 4.0.1, dar ar trebui să funcționeze și în 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" 

De asemenea, am scris un mic script shell însoțitor:

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

(Dacă aveți GNU Awk 4.1.0 sau o versiune ulterioară, puteți utiliza pavilionul -i în loc de construcția de mutare la sfârșit.)

Comentarii

  • @Mandragor Dacă SOMENAME din comentariile de deschidere și de închidere trebuie să se potrivească, dă-mi un strigăt.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *