36

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

    </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 执行此操作。

4

18 回答 18

77

grep

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

在 OSX / BSD 系统上:

grep -Ev '^\s*$|^\s*\#' temp
于 2013-06-30T17:27:12.647 回答
28

awk

awk '!/^ *#/ && NF' file
  • !/^ *#/- 表示选择没有空格后跟#符号的行
  • NF- 表示选择非空白行
  • &&- 是一个and运算符,它确保上述两个都为真,然后打印该行。
于 2013-07-01T02:44:50.613 回答
8

这可能比使用更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
于 2013-06-30T17:22:41.767 回答
5

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
于 2013-06-30T22:21:17.737 回答
4

这个应该做:

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% 万无一失的:如果你有一个井号 ( #) 而不是开始注释,即它被转义或在字符串中,那么你可以想象会发生什么。

于 2013-06-30T18:03:34.913 回答
4

小升级

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

此代码不包括空行或仅包含空格的行、以 # 开头的行以及在 # 之前仅包含空格的行。

PS:^#不一样^\s*#

于 2016-02-13T21:28:43.960 回答
3
grep ^[^#] filename
  • ^- 行首

  • [^#]- 排除 #。

如果行首有空格,它将不起作用。

于 2014-12-25T17:12:22.237 回答
3

想不出比这更简单的事情了:

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

您可以使用此文件进行测试:

# comment
 # comment with space before
  # comment with two spaces before
line with text and # comment at the end

line with text

(编辑为包含“*”并处理带有前导空格的注释)

于 2020-12-03T19:48:01.460 回答
1

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

于 2014-01-03T03:48:27.747 回答
1
sed -n '/^\s*[^#]\|^$/!'p filename

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

于 2016-07-14T18:46:26.717 回答
1

使用默认空格分隔符

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

所以,保持简单

awk '$1 ~ /^[^#]/ ' YourFile
于 2017-01-24T13:42:15.800 回答
1

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

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

玩得开心。

于 2021-04-04T00:03:27.927 回答
0
grep -v '^$\|^#\|^\s*\#' filename

不包括空行、以 # 开头的行以及在 # 之前只包含空格的行。

于 2014-05-30T17:24:47.533 回答
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
#####
于 2015-04-06T19:17:18.637 回答
0
grep -v '^$\|^#\|^\s*\#' filename | grep -v "^[[:space:]]*$" | more
于 2015-04-06T19:39:34.513 回答
0

使用 Perl:

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

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

perl -lne 'print if ! m{^\s*((#|//).*)?$}' file
于 2015-09-15T01:04:48.043 回答
0

以下:

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

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

于 2018-03-14T16:02:15.277 回答
-1
cat filename| egrep -v "^\s*$|^;|^\s*#
  • 一、cat文件
  • egrep -v移除
  • ^$从空行开始
  • ^;从...开始;
  • ^\s匹配任何前导空格,然后匹配任何字符,直到#
于 2014-11-26T03:18:06.087 回答