Wie kann ich einen Abschnitt im Quellcode mit sed oder awk auskommentieren?

Derzeit habe ich Dateien, die Abschnitte wie diesen

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

Ich möchte auskommentieren, was zwischen „# BEGIN SOMENAME“ und „# END“ liegt, damit es am Ende so aussieht

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

Kann ich dies mit awk oder sed erreichen? und kann ich es leicht umkehren?, also nur eine Operation, die wieder „kommentiert“?

Was ich vermeiden möchte, um Fehler zu machen. Wenn die Zeilen bereits auskommentiert sind, sollten sie in Ruhe gelassen werden. Auch in „Kommentar in“ sollte nicht versucht werden, etwas zu tun, wenn die Zeilen zwischen Ende und Anfang nicht mit einem „#“ beginnen.

Versucht, dass jetzt seit mehreren Stunden kein Erfolg.

Eine mögliche Lösung gefunden:

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 

Kommentare

  • Vielleicht, weil dieser alte Code hat Fehler wie diese mehrere Startzeilen (Fehler kopieren / einfügen …?) nacheinander, und Sie müssen nur die erste ignorieren oder irgendwann beginnt der Anfang und die Datei endet …. i ' Ich möchte dieses Skript lieber nicht posten, es ist jetzt konkurrenzfähig kaputt …
  • Sie haben Recht. fügte dies zu Herausforderungen hinzu. Tut mir leid, ich wurde müde und es scheint immer, wenn ich eine Teillösung gefunden habe, alle anderen Dinge funktionieren nicht mehr.

Antwort

Dieses Skript funktioniert für mich. Ich habe es in GNU Awk 4.0.1 getestet, sollte aber auch in Nawk funktionieren.

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" 

Ich habe auch ein kleines begleitendes Shell-Skript geschrieben:

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

(Wenn Sie GNU Awk 4.1.0 oder höher haben, können Sie das Flag -i anstelle der Verschiebungskonstruktion am Ende verwenden.)

Kommentare

  • @Mandragor Wenn SOMENAME in den Eröffnungs- und Schlusskommentaren übereinstimmen muss, rufen Sie mich an.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.