2010-07-28 7 views
15

comment supprimer les lignes de commentaires (comme # bal bla) et les lignes vides (lignes sans chartes) du fichier avec une commande sed?sed + supprimer "#" et les lignes vides avec une commande sed

THX Lidia

+0

J'ai effectué un test. paxdiablo contre Chris Johnson. Le fichier de test était squid.conf. squid.conf a plus de 1000 lignes de commentaires pour 15 lignes de config. La méthode paxdiablo a parfaitement fonctionné. Il a même supprimé les commentaires après une config sur la même ligne. Les résultats étant exactement ce que vous attendez, sinon mieux. Les deux pouces en l'air! La méthode améliorée de Chris Johnson semblait supprimer chaque ligne avec un #, peu importe où # était placé dans la ligne. Il en résulte des lignes supprimées qui n'auraient pas dû l'être. Bien essayé Chris. Une bonne devise que j'aime vivre est "Si elle n'est pas cassée, ne la répare pas". –

Répondre

26

Si vous êtes inquiet au sujet de commencer deux sed processus dans un pipeline au lieu d'un, vous ne devriez probablement pas, ce n'est pas que inefficace.

Cependant, si vous ne veulent un seul processus, vous pouvez utiliser plusieurs -e arguments, quelque chose comme:

sed -e 's/#.*$//' -e '/^$/d' inputFile 

En réponse à votre commentaire sur pourquoi vous voulez un seul processus , souhaitant utiliser sed -i pour l'édition sur place, vous pouvez toujours le faire selon la transcription suivante:

pax> echo 'Line # with a comment' >qq 
pax> echo >>qq 
pax> echo '# Line with only a comment' >>qq 
pax> cat qq 
Line # with a comment 

# Line with only a comment 
pax> sed -i -e 's/#.*$//' -e '/^$/d' qq 
pax> cat qq 
Line 
pax> _ 

Notez comment le fichier est modifié sur place même avec deux options -e. Vous pouvez voir que les deux commandes sont exécutées sur chaque ligne. La ligne avec un commentaire a d'abord le commentaire supprimé puis tout est supprimé car il est vide.

En outre, la ligne vide d'origine est également supprimée.

+0

mais si je veux utiliser le sed -i (comment intégrer) – lidia

+0

Cela fonctionne encore très bien, voir la mise à jour. – paxdiablo

+4

Plusieurs arguments '-e' ne sont pas nécessaires. Une fois peut ajouter un ';' pour préformer plusieurs actions. c'est-à-dire 'sed '/ ^[#;].*$/ d;/^ $/d'' –

3

variante alternative, en utilisant grep:


cat file.txt | grep -Ev '(#.*$)|(^$)' 
+0

mais si le "#" ne mendie pas du fichier? (mais la ligne commence par "#") – lidia

+0

cat file.txt | grep -Ev '(^ #. * $) | (^ $)' pour supprimer les lignes commençant par "#" – demetrios

+0

Ceci est très intuitif en termes de préservation du fichier d'origine. –

1

vous pouvez utiliser awk

awk 'NF{gsub(/^[ \t]*#/,"");print}' file 
10

@paxdiablo a une bonne réponse, mais il peut être amélioré.

(1) La clause '/^$/d' ne correspond qu'à 100% des lignes vides.

Si vous voulez faire correspondre aussi des lignes qui sont entièrement blancs (espaces, onglets, etc.) utilisent ceci:

'/^\s*$/d' 

(2) La clause 's/#.*$//' correspond uniquement à des lignes qui commencent par le caractère # dans la colonne 0.

Si vous voulez faire correspondre aussi des lignes qui ont seulement des espaces avant la première utilisation # ceci:

'/\s*#.*$/d' 

Les critères ci-dessus peuvent ne pas être universels (par ex. dans un bloc HEREDOC, ou dans une chaîne multiligne Python, les différentes approches peuvent être significatives), mais dans la plupart des cas, la définition conventionnelle des lignes "vides" inclut les espaces uniquement, et les lignes "commentaire" incluent les espaces blancs puis #. (3) Enfin, sur OSX au moins, la solution @paxdiablo dans laquelle la première clause transforme les lignes de commentaires en lignes vides, et la deuxième clause supprime les lignes vides (y compris ce qui était initialement commentaires). Il semble être plus portable pour faire les deux actions /d supprimer des actions comme je l'ai fait.

La commande révisée incorporant ce qui précède est:

sed -e '/\s*#.*$/d' -e '/^\s*$/d' inputFile 
+0

Existe-t-il un moyen de combiner les deux en un seul motif? J'ai essayé plusieurs combinaisons mais ça ne marche pas. Donc je veux savoir s'il y a un moyen, et sinon, pourquoi? Merci! – bruin

0

On (l'un des) mes boîtes de Linux, sed comprend les expressions régulières avec l'option -r, donc:

-r sed «/(^ \ s * #) | (^ \ s * $)/d 'squid.conf.installé

est très utile pour afficher toutes les lignes non vides, sans commentaire. L'expression régulière correspond au début de la ligne suivie par zéro ou plusieurs espaces ou tabulations suivis d'un hachage ou d'une fin de ligne et supprime les lignes correspondantes de l'entrée.

0

Le premier exemple (paxdiablo) est très bon sauf son fichier non modifié, juste le résultat de sortie. Si vous voulez changer en ligne:

sudo sed -i 's /#.*$//;/^$/ d' INPUTFILE

0

Ce petit bijou supprime tous # commentaires, pas importe où ils commencent en ligne:

sed -e 's/\s*#.*$//' 

Exemple:

text=" 
this is a # test 
#this is a test 
#this is a #test 
this is # another #test 
" 

$echo "$text" | sed -e 's/\s*#.*$//' 

this is a 


this is 

Suivant cela supprime toutes les lignes vides résultant:

$echo "$text" | sed -e 's/\s*#.*$//' | sed -e '/^\s*$/d'