web-dev-qa-db-fra.com

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 ces lignes) qui commencent par #? Les autres lignes contenant #, mais pas au début de la ligne doivent être ignorées.

153
Village

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

sed '/^#/ d'

Cela dit, "trouvez toutes les lignes commençant par # et supprimez-les en laissant tout le reste".

256
Raymond Hettinger

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é.

Notez cependant qu'une convention courante veut que tout, d'un # à la fin d'une ligne, soit 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 être pertinent ou non pour votre cas) (et il laisse des lignes vides).

Une ligne commençant par des espaces arbitraires suivis de # peut également être traitée comme un commentaire:

grep -v '^ *#' filename

si les espaces ne sont que des espaces, ou

grep -v '^[  ]#' filename

où les deux espaces sont en fait un espace suivi d'un caractère de tabulation littéral (type "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).

51
Keith Thompson

Le contraire de la solution de Raymond:

sed -n '/^#/!p'

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

13
ata

Vous pouvez utiliser ce qui suit pour une solution awk -

awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile
7
jaypal singh

vous pouvez directement éditer votre fichier avec

sed -i '/^#/ d'

Si vous souhaitez également supprimer les lignes de commentaire commençant par une certaine espace, utilisez

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

Habituellement, vous voulez conserver la première ligne de votre script, s'il s'agit d'un sha-bang, afin que sed ne supprime pas les lignes commençant par #!. De plus, il devrait supprimer les lignes, qui ne contiennent qu'un hachage, mais pas de texte. mets le tout ensemble:

sed -i '/^\s*\(#[^!].*\|#$\)/d'
5
rubo77

Cette réponse s'appuie sur le précédent réponse de Keith .

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

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

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

5
Acumenus