jak mohu komentovat / v sekci ve zdrojovém kódu pomocí sed nebo awk

V současné době mám soubory, které obsahují takové sekce

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

To, co chci udělat, je okomentovat, co je mezi „# BEGIN SOMENAME“ a „# END“, aby to nakonec vypadalo takto

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

Mohu toho dosáhnout pomocí awk nebo sed? a mohu to snadno zvrátit ?, takže jen operace, která znovu „komentuje“?

Čemu se chci vyhnout, abych udělal chyby, takže pokud jsou řádky již komentovány, mělo by to zůstat samo. Také v „komentáři“ by se nemělo pokoušet něco udělat, pokud řádky mezi koncem a začátkem nezačínají znakem „#“.

Zkoušel jsem to teď několik hodin, žádný úspěch. >

Nalezeno možné řešení:

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 

Komentáře

  • možná, protože tento starý kód má takové chyby, jako je několik počátečních řádků (kopírování / vkládání chyb …?) za druhým, a stačí ignorovat první nebo někdy začíná začátek a soubor končí …. i ' Raději tento skript nezveřejňuji, je nyní kompetentně rozbitý ….
  • máte pravdu. přidal to k výzvám. Omlouvám se unavený a zdá se, že vždy, když jsem našel částečné řešení, všechny ostatní věci přestanou fungovat

Odpovědět

Tento skript funguje pro mě. Testoval jsem to v GNU Awk 4.0.1, ale měl by fungovat také v Nawku.

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" 

Také jsem napsal malý doprovodný skript shellu:

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

(Pokud máte GNU Awk 4.1.0 nebo novější, můžete místo konstrukce přesunu na konci použít příznak -i.)

Komentáře

  • @Mandragor Pokud se SOMENAME v úvodním a závěrečném komentáři musí shodovat, zakřičte.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *