J'ai un dossier avec des commentaires:
foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this
Je veux juste imprimer tout le code non commenté:
foo
bar
stuff
morestuff
evenmorestuff
Pouvoir retirer des commentaires d'un fichier est si important ... Quelle est la bonne façon de le faire?
shell-script
text-processing
awk
sed
grep
Point d'interrogation
la source
la source
awk -F\# '$1!="" { print $1 ;} '
.echo '#' # output a #
gérée une ligne comme ?Réponses:
Une façon de supprimer tous les commentaires est d'utiliser
grep
avec l'-o
option:où
-o
: imprime uniquement une partie correspondante de la ligne^
: début de la ligne[^#]*
: tout caractère sauf#
zéro ou plusieurs fois répétéNotez que les lignes vides seront également supprimées, mais les lignes avec uniquement des espaces resteront.
la source
grep -v '^#' file > newfilewithoutcomments
somvar='I am a long complicated string ## with special characters' # and I am a comment
ne sera pas gérée correctement.grep -o '^[^#].*' file
sed
solution n'a qu'une seule ligne vierge, semble être un argument solide pour utiliser une autre réponse, sauf si je manque quelque chose?grep
peut-être? Essayez de passergrep
àcommand grep
, si vous voyez toujours des espaces après l'exemple d'entrée.Je crois que cela
sed
peut faire un bien meilleur travail que celagrep
. Quelque chose comme ça:Explication
sed
regardera par défaut votre fichier ligne par ligne et imprimera chaque ligne après avoir éventuellement appliqué les transformations dans les guillemets. (sed '' your_file
affichera simplement toutes les lignes inchangées).sed
deux commandes à exécuter sur chaque ligne (elles sont séparées par un point-virgule)./^[[:blank:]]*#/d
. En anglais, cela signifie que si la ligne correspond à un hachage à son début (précédé d'un nombre quelconque de blancs de début), supprimez cette ligne (elle ne sera pas imprimée).s/#.*//
. En anglais c'est-à-dire, remplacez une marque de hachage suivie par autant de choses que vous pouvez trouver (jusqu'à la fin de la ligne, c'est-à-dire) par rien (rien n'est l'espace vide entre les deux derniers//
).la source
mystring="Hello I am a #hash"
, deviendramystring="Hello I am a"
crontab
que n'autorisent que les commentaires de ligne complète, avec ou sans espace blanc de début, mais n'autorisent pas les commentaires de fin sur une ligne. La logique est BEAUCOUP plus simple. Utilisez uniquement la première des deux instructions Sed dans cette réponse. pour un décapant de commentaires crontab.)#
(dans la colonne 1), y a-t-il un avantage àsed
plusgrep -v "^#"
?Vous pouvez obtenir la sortie requise à l'aide de la commande sed. La commande ci-dessous avait fait l'affaire pour moi.
Où
#.*$
- Regexp filtrera toute la chaîne qui commence#
jusqu'à la fin de la ligneIci, nous devons supprimer ces lignes afin que nous les remplacions par des pièces vides afin de sauter le remplacement.
g
- mentionner la recherche répétée du motif jusqu'à la fin du fichier.Syntaxe générale de sed:
s/regexp/replacement/flags FileName
la source
sed
commande ...print "#tag" # Print a hashtag.
Comme d'autres l'ont souligné, sed et d'autres outils basés sur du texte ne fonctionneront pas bien si des parties d'un script ressemblent à des commentaires mais ne le sont pas. Par exemple, vous pourriez trouver un # à l'intérieur d'une chaîne, ou le plutôt commun
$#
et${#param}
.J'ai écrit un formateur de shell appelé shfmt , qui a une fonctionnalité pour réduire le code. Cela comprend la suppression des commentaires, entre autres:
L'analyseur et l'imprimante sont des packages Go, donc si vous souhaitez une solution personnalisée, il devrait être assez facile d'écrire un programme Go de 20 lignes pour supprimer les commentaires exactement comme vous le souhaitez.
la source
Vous pouvez utiliser une correspondance inversée comme ceci:
-v, --invert-match Inverse le sens de la correspondance, pour sélectionner les lignes non correspondantes. (-v est spécifié par POSIX.)
la source
evenmorestuff
dans l'exemple de l'OP.grep -o '^[^#]*' file
serait la meilleure solution. cela est déjà expliqué par jimmij. merci pour votre avisprint "#tag" # Print a hashtag.
J'aime la réponse de Joseph mais j'en avais besoin pour me déshabiller // commentaires aussi donc je l'ai légèrement modifiée et testée sur redhat
Je parie qu'il y a une meilleure façon de supprimer les lignes vides que d'utiliser des chaînes, mais c'était la solution rapide et sale que j'ai utilisée.
-à votre santé
la source
print "#tag" # Print a hashtag.
Cela a fonctionné pour moi
la source
print "#tag" # Print a hashtag.
Il utilise
#
comme séparateur de colonnes et ne conserve que la première colonne (c'est tout avant#
).la source
YOUR_FILE
s'agit d'un script contenant ces commandes, le script resteraitcat YOUR_FILE | cut -'
dans le fichier sur cette ligne.Utilisez une expression comme
: -v: fera une correspondance inversée
: #: correspondra à toutes les lignes commençant par #
: $ ^: correspondra à toutes les lignes vides
la source
#
correspondra n'importe où sur la ligne et supprimera toute la ligne.La meilleure solution serait d'utiliser la commande:
sed -i.$(date +%F) '/^#/d;/^$/d' ntp.conf
Le -i est la modification sur place mais le préfixe suivant directement indique à sed de créer une sauvegarde. Dans ce cas avec une extension de date (ntp.conf.date) Nous exécutons deux commandes chacune avec un espace d'adressage, la première supprime les lignes commentées et la seconde, séparée de la première par un point-virgule, supprime les lignes vides.
J'ai trouvé cette solution sur: theurbanpenguin.com
la source
Aucune des autres réponses ne semble rendre cette justice, soit elles laissent des lignes vides, soit des lignes où le commentaire n'est pas au premier caractère. J'ai fini par utiliser ceci:
Cela crée un alias, afin que vous n'ayez pas à le mémoriser (ce qui est impossible au départ). Ouvrez une nouvelle session et vous aurez la nouvelle
nocom
commande. Ensuite, vous pouvez simplementÀ votre santé.
la source
.*$
dans le premier regex - l'ancre n'est pas utile et vous ne capturez pas le texte correspondant à utiliser dans un remplacement. utiliser juste^\s*
print "#tag" # Print a hashtag.
Suite à la 2ème réponse de Joseph R., j'ajoute
/^$/d
pour supprimer la ligne vierge.la source
Je poste ce qui fonctionne pour moi et semble avoir le plus de sens, après avoir lu les autres, avec explication. Quelques articles sont venus près, mais je ne pouvais pas encore commenter (parce que je suis un nouveau):
-E
= interpréter le modèle suivant comme une expression régulière, similaire à l'utilisation d'egrep-v
= imprimer l'inversion du motif (les lignes qui ne correspondent pas à l'expression seront imprimées)"(^#.*|^$)"
= ceci a un tube qui désigne une instruction OR. Cette expression indique d'imprimer toute ligne commençant par un#
(et tout autre élément après) OU toute ligne de zéro caractère entre le début et la fin de la ligne.Le
-v
va imprimer sur l'écran l'inversion de cela, qui sera n'importe quelle ligne avec des caractères qui ne commence pas par un#
.la source
print "#tag" # Print a hashtag.