如何使用grep / sed打印文件,不包括注释和空行?

时间:2013-06-30 17:16:22

标签: regex perl sed awk grep

我想打印出一个包含一系列评论的文件,如:

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

本质上,该文件包含多个缩进级别,其中注释以#符号开头。

grep应删除空白行,以及文本前有散列符号的行(暗示这些是注释)。

我知道可以通过以下方式删除空行:grep -v '^$'

但是,如何删除带有前导空格的行,然后删除#符号,并仅打印出包含实际代码的行?我想在bash中使用grep和/或sed。

18 个答案:

答案 0 :(得分:54)

使用grep

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

答案 1 :(得分:20)

使用awk

awk '!/^ *#/ && NF' file
  • !/^ *#/ - 表示选择没有空格后跟#符号
  • 的行
  • NF - 表示选择非空白行
  • && - 是and运算符,可确保上述两种情况均为真,然后打印该行。

答案 2 :(得分:7)

使用sed而不是grep

可能会更容易
sed -e '/^[[:space:]]*$/d' -e '/^[[:space:]]*#/d' test.in

或者使用ERE:

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

使用ERE,grep也可以很容易地做到这一点:

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

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

答案 3 :(得分:3)

这个应该做的:

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

在此输入上:

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

您将获得此输出:

Hello everybody
This is a genuine line followed by a comment

警告。这种方法并非100%万无一失:如果你有一个井号(#)没有开始评论,即它已经逃脱或在一个字符串内,那么,你可以想象会发生什么。

答案 4 :(得分:3)

GNU代码

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

答案 5 :(得分:3)

小升级

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

此代码排除空行或仅包含空格的行,以#开头的行,以及在#之前只包含空格的行。

PS:^#^\s*#

不同

答案 6 :(得分:2)

grep ^[^#] filename
  • ^ - 行首

  • [^#] - 排除#。

如果您在行首处有空格,则无效。

答案 7 :(得分:1)

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

答案 8 :(得分:1)

使用默认空格分隔符

  • 空白的空行或行只有空$ 1
  • 第一个非空白的行是#,#是#1,以#
  • 开头

所以,保持简单

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

答案 9 :(得分:1)

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

模式将匹配从行首开始的任何数量的空格(或零),并跟随任何不是#的字符 或空字符串(在^和$之间根本没有)。
为了不匹配,sed允许使用运算符(反转匹配)。现在模式匹配正则表达式不适合的任何内容 因此,结合 -n (禁止打印任何东西)和 p 标记(打印)行将匹配除模式之外的任何内容。

答案 10 :(得分:0)

这是一个简单的单行 grep。这将摆脱散列和空行。

grep -ve '^#' -ve '^$' /path/to/the/file

玩得开心。

答案 11 :(得分:0)

没有比这更简单的事情了

cat filename | grep -v '^#\|^$'

答案 12 :(得分:0)

以下内容:

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

隐藏以#开头的行,空行和仅包含空格的行将打印到标准输出。请注意,必须转义|字符。希望有所帮助

答案 13 :(得分:0)

使用Perl:

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

这也将忽略C ++注释(//)

perl -lne 'print if ! m{^\s*((#|//).*)?$}' file

答案 14 :(得分:0)

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

答案 15 :(得分:0)

#!/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
#####

答案 16 :(得分:0)

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

排除空行,​​以#开头的行和在#。

之前只包含空格的行

答案 17 :(得分:-1)

cat filename| egrep -v "^\s*$|^;|^\s*#
  • 首先,cat文件
  • egrep -v删除
  • ^$以空行开头
  • ^;;
  • 开头
  • ^\s匹配任何前导空格,然后匹配任何字符#