Este script funciona para mim. Eu testei no GNU Awk 4.0.1, mas também deveria funcionar em 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'
Também escrevi um pequeno script de acompanhamento:
#!/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
(Se você tiver o GNU Awk 4.1.0 ou posterior, você pode usar o sinalizador -i em vez da construção de movimentação no final.)