miten voin kommentoida / lähdekoodin osassa sedillä tai awk: lla

Minulla on tällä hetkellä tiedostoja, jotka sisältävät tällaisia osioita

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

Haluan kommentoida, mikä on ”# BEGIN SOMENAME” ja ”# END” välillä, jotta loppujen lopuksi se näyttää tältä

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

Voinko saavuttaa tämän awk- tai sed-toiminnolla? ja voinko peruuttaa sen helposti ?, siis vain operaatio, joka ”kommentoi” uudelleen?

Mitä haluan välttää tekemästä virheitä, joten jos rivit on jo kommentoitu, se on jätettävä yksin. Myöskään ”kommentti sisään” -kohdassa ei pitäisi yrittää tehdä jotain, jos rivin loppu ja alku eivät ala ”#” – merkillä.

Yritti nyt useita tunteja, ei menestystä.

Löytyi mahdollinen solutiini:

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 

Kommentit

  • ehkä, koska tämä vanha koodi on virheitä, kuten että useita aloitusrivejä (kopioi / liitä vikoja …?) toisensa jälkeen, ja sinun tarvitsee vain jättää huomioimatta ensimmäinen tai joskus alku alkaa ja tiedosto päättyy …. i ' äläkä lähetä tätä komentosarjaa, se on kilpailukykyisesti rikki nyt.
  • olet oikeassa. lisäsi tämän haasteisiin. Anteeksi, että väsyin, ja näyttää siltä, että kun löysin osittaisen ratkaisun, kaikki muut asiat lakkaavat toimimasta.

Vastaa

Tämä käsikirjoitus toimii minulle. Testasin sen GNU Awk 4.0.1: ssä, mutta minun pitäisi toimia myös Nawkissa.

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" 

Kirjoitin myös pienen mukana olevan komentosarjan komentosarjan:

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

(Jos sinulla on GNU Awk 4.1.0 tai uudempi, voit käyttää -i-lippua lopussa olevan siirtorakenteen sijaan.)

Kommentit

  • @Mandragor Jos alku- ja loppukommenttien SOMENAME on vastattava, huuda minulle.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *