jak mogę dodać komentarz do sekcji w kodzie źródłowym za pomocą sed lub awk

Obecnie mam pliki, które zawierają takie sekcje

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

To, co chcę zrobić, to skomentować to, co jest między „# BEGIN SOMENAME” a „# END”, aby ostatecznie wyglądało to tak. div id = „a4e1bea16f”>

Czy mogę to osiągnąć za pomocą awk lub sed? i czy mogę to łatwo odwrócić?, więc tylko operacja, która „komentuje” ponownie?

Czego chcę uniknąć popełniania błędów, więc jeśli linie są już zakomentowane, należy zostawić je w spokoju. Również w „komentarz w” nie powinno próbować nic robić, jeśli linie między końcem a początkiem nie zaczynają się znakiem „#”.

Próbowałem tego teraz przez kilka godzin, bez powodzenia.

Znaleziono możliwe rozwiązanie:

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 

Komentarze

  • może, ponieważ ten stary kod zawiera takie błędy, że wiele linii początkowych (błędy kopiowania / wklejania …?) po kolejnych, wystarczy zignorować pierwszy z nich lub czasami początek zaczyna się, a plik się kończy …. i ' raczej nie publikuj tego skryptu, jest on teraz kompletnie uszkodzony ….
  • masz rację. dodał to do wyzwań. Przepraszam, zmęczyłem się i wydaje mi się, że zawsze kiedy znajduję częściowe rozwiązanie, wszystkie inne rzeczy przestają działać

Odpowiedź

Ten skrypt działa dla mnie. Przetestowałem to w GNU Awk 4.0.1, ale powinno również działać w 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" 

Napisałem również mały towarzyszący skrypt powłoki:

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

(Jeśli masz GNU Awk 4.1.0 lub nowszy, możesz użyć flagi -i zamiast konstrukcji move na końcu).

Komentarze

  • @Mandragor Jeśli SOMENAME w komentarzu otwierającym i zamykającym musi pasować, daj mi znać.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *