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
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
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.
variante alternative, en utilisant grep:
cat file.txt | grep -Ev '(#.*$)|(^$)'
vous pouvez utiliser awk
awk 'NF{gsub(/^[ \t]*#/,"");print}' file
@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
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
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.
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
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'
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". –