web-dev-qa-db-fra.com

Comment imprimer un fichier, excluant les commentaires et les lignes vides, en utilisant grep/sed?

Je voudrais imprimer un fichier contenant une série de commentaires comme:

    </Directory>
    ErrorLog ${Apache_LOG_DIR}/error.log
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
    CustomLog ${Apache_LOG_DIR}/ssl_access.log combined
    #   SSL Engine Switch:

En substance, le fichier contient plusieurs niveaux d'indentation, dans lesquels un commentaire commence par un symbole #

grep devrait supprimer les lignes vides, ainsi que les lignes contenant un symbole de hachage avant le texte (ce qui implique qu'elles sont des commentaires).

Je sais que les lignes vides peuvent être supprimées via: grep -v '^$'

Cependant, comment puis-je supprimer des lignes contenant des espaces, puis un symbole #, et n’imprimer que les lignes contenant le code actuel? Je voudrais faire ceci en bash, en utilisant grep et/ou sed.

22
Joel G Mathew

Avec grep:

grep -v '^$\|^\s*\#' temp
53
gbrener

Avec awk:

awk '!/^ *#/ && NF' file
  • !/^ *#/ - signifie que les lignes sans espace sont suivies du symbole # 
  • NF - signifie sélectionner des lignes qui ne sont pas vides 
  • && - est un opérateur and qui vérifie que les deux conditions susmentionnées sont vraies, puis affiche la ligne.
20
jaypal singh

Ceci est probablement plus facile avec sed que grep:

sed -e '/^[[:space:]]*$/d' -e '/^[[:space:]]*#/d' test.in

Ou avec un ERE:

# Gnu sed need -re instead of -Ee
sed -Ee '/^[[:space:]]*(#|$)/d' test.in

Avec ERE, grep peut le faire assez facilement aussi:

# Not sure if Gnu grep needs -E or -r
grep -vE '^\s*(#|$)' test.in

# or a BRE
grep -v '^\s*\(#\|$\)' test.in
7
Kevin

Code pour GNU sed :

sed -r '/^(\s*#|$)/d;' file

$cat file
    </Directory>
    ErrorLog ${Apache_LOG_DIR}/error.log
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    next line is empty

       line with leading space
       # line with leading space and #
    LogLevel warn
        #line with leading tab and #
        line with leading tab
    CustomLog ${Apache_LOG_DIR}/ssl_access.log combined
    #   SSL Engine Switch:
$sed -r '/^(\s*#|$)/d;' file
    </Directory>
    ErrorLog ${Apache_LOG_DIR}/error.log
    next line is empty
       line with leading space
    LogLevel warn
        line with leading tab
    CustomLog ${Apache_LOG_DIR}/ssl_access.log combined
3
captcha

Petite mise à niveau

grep -v '^\s*$\|^#\|^\s*\#' filename

Ce code exclut les lignes vides ou les lignes comportant uniquement des espaces, les lignes commençant par # et les lignes ne contenant que des espaces avant #.

PS: ^# est différent de ^\s*# 

3
Mintaka

Celui-ci devrait faire:

sed 's/[[:space:]]*#.*//;/^[[:space:]]*$/d' file

Sur cette entrée:

Hello everybody

# This is a comment and the previous line was empty

This is a genuine line followed by a comment # this is the comment


              # and here a comment in the middle of nowhere

vous obtiendrez cette sortie:

Hello everybody
This is a genuine line followed by a comment

Caveat. Ce type de méthode n’est pas à 100% infaillible: si vous avez un signe dièse (#) ne commençant pas un commentaire, c’est-à-dire qu’il est échappé ou entre des chaînes, eh bien, vous pouvez imaginer ce qui va se passer.

2
gniourf_gniourf
grep ^[^#] filename
  • ^ - début de ligne

  • [^#]- exclure #.

Si vous avez des espaces en début de ligne, cela ne fonctionnera pas.

2
tamerlaha

Utilisation du séparateur d'espace par défaut

  • ligne vide ou ligne avec vide seulement un $ 1 vide
  • la ligne avec le premier non blanc ¨char vaut #, commencez par $

alors restez simple

awk '$1 ~ /^[^#]/ ' YourFile
1
NeronLeVelu

egrep -v '^$|^#' /etc/sysctl.conf

1
user3155841

Avec Perl:

Perl -lne 'print if ! /^\s*(#.*)?$/' file

Cela ignorera également les commentaires C++ (//) 

Perl -lne 'print if ! m{^\s*((#|//).*)?$}' file
0
Chris Koknat
grep -v '^$\|^#\|^\s*\#' filename

Exclut les lignes vides, les lignes commençant par # et les lignes ne contenant que des espaces avant #.

0
BHG
sed -n '/^\s*[^#]\|^$/!'p filename

Le motif correspond à n’importe quel nombre d’espaces (ou zéro) commençant au début de la ligne et suivi d’un caractère autre que #.
OU chaîne vide (rien du tout entre ^ et $).
Pour ne pas correspondre, sed permet l'utilisation de! opérateur (correspondance inverse). Maintenant, le motif correspond à tout ce que l'expression régulière ne convient pas.
Ainsi, la combinaison des lignes -n (suppression de tout ce qui est imprimé) et des lignes p drapeau (impression) correspondant à tout sauf le motif sera imprimée.

0
user176289
#!/bin/bash


#---------------------------------------------------------------#
#             Programacion Shell                                #
#             ------------------                                #
#  Programa:  xable.sh  (eXecutABLEs)                           #
###                                                           ###
#  OBJETIVO:  Filtrar solo las lineas ejecutables de un Shell   #
#                                    (eXecutABLEs)              #
###                                                           ###
#  Autor...:  Francisco Eugenio Cabrera Perez                   #
#  Pais....:  Republica Dominicana                              #
#  Fecha...:  Abril 6 del 2015                                  #
#---------------------------------------------------------------#

         x_FILE=$1
if [ -z $x_FILE ];then
   echo
   echo "      $0 :  Sin Argumento^G"; echo
   echo "USO:  $0 ARCHIVO";            echo
###
   exit 1
fi
#####


#  Ignore COMMENTs and lines that...
#  ---------------------------------
#      EXPLANATION                            (PATTERN)         OBSERVATION
#      -----------                            ---------         -----------
#  1.  Begin_and_End_with_NOTHING             (^$)              NO_Characters
###
#  2.  Begin_with_HASH_symbol                 (^#)              COMMENT
#  3.  Begin_with_SPACE_and_then_HASH_symbol  (^\s*\#)          COMMENT
###
#  4.  Begin_and_End_with_SPACES              (^[[:space:]]*$)  Only_SPACES
#  -------------------------------------------------------------------------
#####
    grep -v '^$\|^#\|^\s*\#' $x_FILE | grep -v "^[[:space:]]*$" | more
#####
0

Le suivant:

grep -v '^#\|^$\|^\s+$' file

Cacherait les lignes commençant par #, les lignes vides et les lignes ne contenant que des espaces blancs seraient imprimées sur la sortie standard Notez que le caractère | doit être échappé. J'espère que cela pourra aider 

0
Ernesto Iser
grep -v '^$\|^#\|^\s*\#' filename | grep -v "^[[:space:]]*$" | more
0