hogyan kommentálhatom / a forráskód egy szakaszában sed vagy awk használatával

Jelenleg vannak fájljaim, amelyek ilyen szakaszokat tartalmaznak

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

Azt akarom tenni, hogy megjegyezzem, mi van a “# BEGIN SOMENAME” és az “# END” között, hogy végül így nézzen ki

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

Ezt elérhetem awk vagy sed funkcióval? és könnyen visszafordíthatom ?, tehát csak egy művelet, amely újra “megjegyzést ír”?

Amit el akarok kerülni, hogy hibákat kövessek el, ezért ha a sorokat már megjegyeztük, akkor békén kell hagyni. Szintén a “comment in” -ban ne próbáljon megtenni valamit, ha a vég és a kezdet közötti sorok nem “#” – vel kezdődnek.

Próbálta ezt most több órán keresztül, nem jár sikerrel.

Talált egy lehetséges megoldást:

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 

Megjegyzések

  • talán, mert ez a régi kód vannak olyan hibái, mint hogy több kezdősor (hibákat másoljon / illesszen be …?) a másik után, és csak az elsőt kell figyelmen kívül hagynia, vagy valamikor a kezdet kezdődik és a fájl véget ér.

inkább ne tegye közzé ezt a forgatókönyvet, a verseny szerint most megszakadt ….

  • igazad van. hozzátette ezt a kihívásokhoz. Sajnálom, hogy elfáradtam, és úgy tűnik, hogy mindig találok részleges megoldást, minden más dolog nem működik.
  • Válasz

    Ez a szkript nekem működik. Teszteltem a GNU Awk 4.0.1-ben, de a Nawk-ban is működnie kell.

    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" 

    Írtam egy kis kísérő shell parancsfájlt is:

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

    (Ha GNU Awk 4.1.0 vagy újabb verziója van, akkor a végén az áthelyezés helyett használhatja az -i jelzőt.)

    Megjegyzések

    • @Mandragor Ha a kezdő és a záró megjegyzésben szereplő SOMENAME-nak egyeznie kell, akkor kiáltson.

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük