regex perl sed awk grep

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 operador and 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á.