Supprimer toutes les lignes commençant par un # d'un fichier

Toutes les lignes avec des commentaires dans un fichier commencent par #. Comment puis-je supprimer toutes les lignes (et seulement les lignes) qui commencent par #? Les autres lignes contenant #, mais pas au début de la ligne doivent être ignorées.

129
demandé sur Raymond Hettinger 2011-11-21 05:17:18

8 réponses

Cela peut être fait avec un sed one-liner:

sed '/^#/ d'

Cela dit: "Trouvez toutes les lignes qui commencent par # et supprimez-les, en laissant tout le reste."

212
répondu Raymond Hettinger 2016-01-15 22:00:10

Je suis un peu surpris que personne n'ait suggéré la solution la plus évidente:

grep -v '^#' filename

Cela résout le problème comme indiqué.

Mais notez qu'une convention commune est que tout, depuis un # jusqu'à la fin d'une ligne, doit être traité comme un commentaire:

sed 's/#.*$//' filename

Bien que cela traite, par exemple, un caractère # dans un littéral de chaîne comme le début d'un commentaire (qui peut ou non être pertinent pour votre cas) (et il laisse des lignes vides).

Une ligne commençant par arbitraire les espaces suivis de # peuvent également être traités comme un commentaire:

grep -v '^ *#' filename

Si les espaces sont uniquement des espaces, ou

grep -v '^[  ]#' filename

Où les deux espaces sont en fait un espace suivi d'un caractère de tabulation littéral (tapez "control-V tab").

Pour toutes ces commandes, omettez l'argument filename à lire à partir de l'entrée standard (par exemple, dans le cadre d'un tuyau).

43
répondu Keith Thompson 2011-11-21 04:10:33

Le contraire de la solution de Raymond:

sed -n '/^#/!p'

"n'Imprimez rien, sauf pour les lignes qui ne commencent pas par #"

10
répondu ata 2011-11-21 03:14:40

Vous pouvez utiliser ce qui suit pour une solution awk -

awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile
6
répondu jaypal singh 2011-11-21 03:02:22

Cette réponse s'appuie sur la précédente réponse par Keith.

egrep -v "^[[:blank:]]*#" devrait filtrer les lignes de commentaire.

egrep -v "^[[:blank:]]*(#|$)" devrait filtrer les commentaires et les lignes vides, comme cela est souvent utile.

Pour plus d'informations sur [:blank:] et d'autres classes de caractères, reportez-vous à https://en.wikipedia.org/wiki/Regular_expression#Character_classes .

5
répondu A-B-B 2017-05-23 12:03:05

, Vous pouvez modifier directement votre fichier avec

sed -i '/^#/ d'

Si vous voulez également supprimer les lignes de commentaire qui commencent par des espaces, utilisez

sed -i '/^\s*#/ d'

Généralement, vous voulez garder la première ligne de votre script, si c'est un sha-bang, donc sed ne doit pas supprimer les lignes commençant par #!. en outre, il devrait supprimer des lignes, qui contiennent seulement un hachage mais pas de texte. mettez tout cela ensemble:

sed -i '/^\s*\(#[^!].*\|#$\)/d'
2
répondu rubo77 2017-06-05 21:28:20

Pour supprimer le symbole de commentaire (#) mais garder le reste de la ligne et garder le SHA-bang:

 awk '{ if( ($0 !~ /^ *#/) || ($0 ~ /^ *#!/) ) print $0 ; else  {gsub(/^ *#/ , "" ); print } } ' teste.sh  nter code here
1
répondu Shoo Limberger 2012-10-26 19:29:13

Voici avec une boucle pour tous les fichiers avec une extension:

ll -ltr *.filename_extension > list.lst

for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls 
do
    echo $i
    sed -i '/^#/d' $i
done
-1
répondu Bruno Damas 2017-09-28 11:35:50