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

182

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

Village
la source
1
Doit-il fonctionner avec la convention commune qui #blah \<nl>blahcompte comme une seule «ligne logique» car la barre oblique inverse échappe à la nouvelle ligne?
sarnold
@sarnold: mis à part make, quels utilitaires utilisent les 'lignes d'épissure anti- slash avant de terminer un commentaire'? Les shells (testés bash et ksh) ne le font pas. C et C ++ gèrent l'épissage de nouvelle ligne avant tout autre traitement des directives de préprocesseur, mais ce sont des directives plutôt que des commentaires.
Jonathan Leffler
@Jonathan: Génial. J'avais supposé que la \<nl>fuite commune fonctionnerait également sur les commentaires. Mais wow j'avais tort. Je n'ai pas encore trouvé d'autre exemple ... :) Merci!
sarnold

Réponses:

302

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

sed '/^#/d'

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

Raymond Hettinger
la source
9
version courte:sed /^#/d
kev
80
Pour les noobs Linux comme moi:sed '/^#/ d' < inputFile.txt > outputFile.txt
Neil McGuigan
50
Version courte: sed -i '/^#/d' filepath.
lesderid
14
Et sed -i '' '/^#/d' filepathsur Mac ( car le suffixe -i est obligatoire )
paulcm
1
@Viesturs Essayez ceci: awk '/^#/ && !first { first=1 ; next } { print $0}'
Raymond Hettinger
56

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 veut que tout, de a #à la fin d'une ligne, soit traité comme un commentaire:

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

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

Une ligne commençant par un espace blanc arbitraire suivi 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 (tapez "control-v tab").

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

Keith Thompson
la source
J'ai ajouté une nouvelle réponse qui s'appuie sur cette réponse.
Acumenus
J'ai eu des difficultés à utiliser grep de cette manière sous Windows. La solution est de remplacer «par», par exemplegrep -v "^#" filename
Serg
14

Le contraire de la solution de Raymond:

sed -n '/^#/!p'

"n'imprimez rien, sauf pour les lignes qui ne commencent PAS par #"

à
la source
9

vous pouvez directement éditer votre fichier avec

sed -i '/^#/ d'

Si vous souhaitez également supprimer les lignes de commentaires commençant par des espaces, utilisez

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

Habituellement, vous souhaitez conserver la première ligne de votre script, s'il s'agit d'un sha-bang, sedne supprimez donc pas les lignes commençant par #!. il devrait également supprimer les lignes, qui ne contiennent qu'un hachage mais pas de texte. mets le tout ensemble:

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

Pour être conforme à toutes les variantes de sed, vous devez ajouter une extension de sauvegarde à l' -ioption:

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak
rubo77
la source
1
plus 1 pour celui qui espace
deepaksingh pawar
7

Vous pouvez utiliser ce qui suit pour une solution awk -

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

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

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

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 .

Acumenus
la source
En supposant que vous egrepsoutenez cette syntaxe; les anciennes versions pourraient ne pas l'être.
Keith Thompson
-3

Le 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
Bruno Damas
la source