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.
Avec grep
:
grep -v '^$\|^\s*\#' temp
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.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
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
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*#
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.
grep ^[^#] filename
^
- début de ligne
[^#]
- exclure #.
Si vous avez des espaces en début de ligne, cela ne fonctionnera pas.
Utilisation du séparateur d'espace par défaut
alors restez simple
awk '$1 ~ /^[^#]/ ' YourFile
egrep -v '^$|^#' /etc/sysctl.conf
Avec Perl:
Perl -lne 'print if ! /^\s*(#.*)?$/' file
Cela ignorera également les commentaires C++ (//)
Perl -lne 'print if ! m{^\s*((#|//).*)?$}' file
grep -v '^$\|^#\|^\s*\#' filename
Exclut les lignes vides, les lignes commençant par # et les lignes ne contenant que des espaces avant #.
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.
#!/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
#####
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
grep -v '^$\|^#\|^\s*\#' filename | grep -v "^[[:space:]]*$" | more