wake-up-neo.com

Wie drucke ich eine Datei mit Ausnahme von Kommentaren und Leerzeilen mit grep/sed?

Ich möchte eine Datei ausdrucken, die eine Reihe von Kommentaren enthält:

    </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:

Im Wesentlichen enthält die Datei mehrere Einrückungsebenen, wobei ein Kommentar mit einem #-Symbol beginnt. 

grep sollte leere Zeilen entfernen, und auch Zeilen, bei denen vor dem Text ein Hash-Symbol steht (was darauf hindeutet, dass dies Kommentare sind).

Ich weiß, dass leere Zeilen gelöscht werden können mit: grep -v '^$'

Wie kann ich jedoch Zeilen mit führendem Leerzeichen und dann einem #-Symbol löschen und nur Zeilen mit tatsächlichem Code ausdrucken? Ich möchte dies in bash, mit grep und/oder sed machen.

22
Joel G Mathew

Mit grep:

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

Mit awk:

awk '!/^ *#/ && NF' file
  • !/^ *#/ - bedeutet Zeilen ohne Leerzeichen gefolgt von #-Symbol 
  • NF - bedeutet, dass Zeilen ausgewählt werden, die nicht leer sind 
  • && - ist ein and-Operator, der sicherstellt, dass beide Zeilen wahr sind.
20
jaypal singh

Dies ist wahrscheinlich mit sed einfacher als grep:

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

Oder mit einem ERE:

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

Mit dem ERE kann grep das auch ganz leicht:

# 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 für 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

Kleines Upgrade

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

Dieser Code schließt leere Zeilen oder Zeilen nur mit Leerzeichen aus, Zeilen, die mit # beginnen, und Zeilen, die nur Leerzeichen vor # enthalten.

PS: ^# unterscheidet sich von ^\s*# 

3
Mintaka

Dies sollte man tun:

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

Bei dieser Eingabe:

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

sie erhalten diese Ausgabe:

Hello everybody
This is a genuine line followed by a comment

Vorbehalt. Diese Methode ist nicht zu 100% narrensicher: Wenn Sie ein Pfundzeichen (#) haben, das keinen Kommentar startet, d.

2
gniourf_gniourf
grep ^[^#] filename
  • ^ - Zeilenanfang

  • [^#]- ausschließen #.

Wenn Sie Leerzeichen am Anfang der Zeile haben, funktioniert es nicht.

2
tamerlaha

Standardmäßige Leerzeichen verwenden

  • leere Zeile oder Zeile mit blank nur $ 1 leer
  • zeile mit dem ersten nicht Leerzeichen ¨char ist #, habe $ 1 beginnend mit #

also halte es einfach

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

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

1
user3155841

Mit Perl:

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

Dies ignoriert auch C++ - Kommentare (//) 

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

Schließt leere Zeilen aus, Zeilen, die mit # beginnen, und Zeilen, die nur Leerzeichen vor # enthalten.

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

Das Muster entspricht einer beliebigen Anzahl von Leerzeichen (oder Null), die am Anfang der Zeile beginnen und von einem beliebigen Zeichen gefolgt werden, das kein # ist.
.__ ODER leerer String (nichts zwischen ^ und $).
Um es NICHT anzupassen, erlaubt sed die Verwendung von! Operator (Übereinstimmung umkehren). Jetzt passt Muster zu allem, was regulärer Ausdruck nicht passt.
Bei Kombination von -n (Unterdrückung des Druckens) und p flag (print) werden Zeilen gedruckt, die mit Ausnahme des Musters übereinstimmen.

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

Folgende:

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

Ausblenden von Zeilen, die mit # beginnen, leere Zeilen und Zeilen, die nur Leerzeichen enthalten, werden in die Standardausgabe gedruckt. Beachten Sie, dass das |-Zeichen mit Escapezeichen versehen werden muss. hoffentlich hilft das 

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