Actuellement, jai des fichiers, qui contiennent des sections comme celle-ci
code statement1 code statement2 # BEGIN SOMENAME some code some other code # END SOMENAME code statement n +1 code statement n +1
Ce que je veux faire, cest commenter ce qui se trouve entre « # BEGIN SOMENAME » et « # END », pour quà la fin cela ressemble à ceci
code statement1 code statement2 # BEGIN SOMENAME # some code # some other code # END SOMENAME code statement n +1 code statement n +1
Puis-je y parvenir avec awk ou sed? et puis-je linverser facilement ?, donc juste une opération, qui « commente » à nouveau?
Ce que je veux éviter de faire des erreurs, donc si les lignes sont déjà commentées, elles doivent être laissées seules. De plus, dans « comment in », il ne devrait pas essayer de faire quelque chose si les lignes entre fin et début ne commencent pas par un « # ».
Jai essayé cela maintenant pendant plusieurs heures, sans succès.
On a trouvé une solution possible:
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
Commentaires
- peut-être, parce que cet ancien code a des erreurs comme celle-ci plusieurs lignes de début (copier / coller des bogues …?) après lautre, et il vous suffit dignorer la première ou parfois le début commence et le fichier se termine …. i ' Je préfère ne pas publier ce script, il est désormais cassé …
- vous avez raison. ajouté cela aux défis. Désolé, je suis fatigué, et il semble toujours que lorsque jai trouvé une solution partielle, toutes les autres choses cessent de fonctionner
Réponse
Ce script fonctionne pour moi. Je lai testé dans GNU Awk 4.0.1, mais devrait également fonctionner dans 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"
Jai également écrit un petit script shell daccompagnement:
#!/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
(Si vous avez GNU Awk 4.1.0 ou version ultérieure, vous pouvez utiliser lindicateur -i au lieu de la construction de déplacement à la fin.)
Commentaires
- @Mandragor Si SOMENAME dans les commentaires douverture et de clôture doit correspondre, donnez-moi un cri.