regex - ¿Cómo imprimir un archivo, excluyendo comentarios y líneas en blanco, usando grep/sed?
perl awk (16)
Me gustaría imprimir un archivo que contenga una serie de comentarios como:
</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 esencia, el archivo contiene múltiples niveles de sangría, donde un comentario comienza con un símbolo #
.
grep debe eliminar las líneas en blanco y también las líneas donde hay un símbolo de hash antes del texto (lo que implica que estos son comentarios).
Sé que las líneas en blanco se pueden eliminar a través de: grep -v ''^$''
Sin embargo, ¿cómo puedo eliminar líneas con espacios en blanco iniciales, y luego un símbolo #
, e imprimir solo líneas con código real? Me gustaría hacer esto en bash, usando grep y / o sed.
Código para 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
Con awk
:
awk ''!/^ *#/ && NF'' file
-
!/^ *#/
- significa líneas de selección que no tienen espacio seguido del símbolo#
-
NF
- significa líneas de selección que no están en blanco -
&&
- es un operadorand
que garantiza que si ambos de los anteriores son verdaderos, imprima la línea.
Con grep
:
grep -v ''^$/|^/s*/#'' temp
Con Perl:
perl -lne ''print if ! /^/s*(#.*)?$/'' file
Esto también ignorará los comentarios de C ++ (//)
perl -lne ''print if ! m{^/s*((#|//).*)?$}'' file
El seguimiento:
grep -v ''^#/|^$/|^/s+$'' file
Ocultar las líneas que comienzan con #
, las líneas vacías y las líneas que solo contienen espacios en blanco desde que se imprimen en la salida estándar. Tenga en cuenta que el |
el personaje tiene que ser escapado Espero que ayude
Este debe hacer:
sed ''s/[[:space:]]*#.*//;/^[[:space:]]*$/d'' file
En esta entrada:
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
obtendrás esta salida:
Hello everybody
This is a genuine line followed by a comment
Advertencia. Este tipo de método no es 100% infalible: si tiene un signo de #
( #
) que no está iniciando un comentario, es decir, se escapó o está dentro de una cadena, bueno, puede imaginar lo que sucederá.
Esto es probablemente más fácil con sed
que grep
:
sed -e ''/^[[:space:]]*$/d'' -e ''/^[[:space:]]*#/d'' test.in
O con un ERE:
# Gnu sed need -re instead of -Ee
sed -Ee ''/^[[:space:]]*(#|$)/d'' test.in
Con el ERE, grep puede hacerlo con bastante facilidad también:
# Not sure if Gnu grep needs -E or -r
grep -vE ''^/s*(#|$)'' test.in
# or a BRE
grep -v ''^/s*/(#/|$/)'' test.in
Pequeña actualización
grep -v ''^/s*$/|^#/|^/s*/#'' filename
Este código excluye líneas vacías o líneas con solo espacios, líneas que comienzan con # y líneas que no contienen más que espacios antes de #.
PS: ^#
es diferente a ^/s*#
Usando separador de espacio predeterminado
- La línea vacía o la línea en blanco solo tienen un $ 1 vacío
- la línea con el primer ¨char no en blanco es #, tiene $ 1 comenzando con #
así que, sea sencillo
awk ''$1 ~ /^[^#]/ '' YourFile
egrep -v ''^$|^#'' /etc/sysctl.conf
#!/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
#####
cat filename| egrep -v "^/s*$|^;|^/s*#
- Primero,
cat
el archivo -
egrep -v
elimina -
^$
comenzando con una línea vacía -
^;
comenzando con -
^/s
coincide con cualquier espacio en blanco inicial, luego cualquier carácter hasta#
grep -v ''^$/|^#/|^/s*/#'' filename | grep -v "^[[:space:]]*$" | more
grep -v ''^$/|^#/|^/s*/#'' filename
Excluye las líneas vacías, líneas que comienzan con # y líneas que no contienen más que espacios antes de #.
grep ^[^#] filename
^
- comienzo de linea[^#]
- excluye #.
Si tiene espacios al comienzo de la línea no funcionará.
sed -n ''/^/s*[^#]/|^$/!''p filename
El patrón coincidirá con cualquier cantidad de espacios en blanco (o cero) comenzando al principio de la línea y siguiendo por cualquier carácter que no sea un #
O cadena vacía (nada en absoluto entre ^ y $).
Para NO coincidir, sed permite el uso de ! operador (partido invertido). Ahora el patrón coincide con cualquier cosa que la expresión regular no encaje.
Por lo tanto, con la combinación de -n (suprimir de la impresión de cualquier cosa) y p (alinear) las líneas que coincidan con cualquier cosa excepto el patrón se imprimirá.