web-dev-qa-db-ja.com

grep / sedを使用して、コメントと空白行を除くファイルを印刷する方法は?

次のような一連のコメントを含むファイルを印刷したいと思います。

    </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 '^$'で削除できることを知っています

しかし、先頭の空白を含む行を削除してから#シンボルを削除し、実際のコードを含む行のみを印刷するにはどうすればよいですか? grepやsedを使用して、bashでこれを実行したいと思います。

25
Joel G Mathew

grepの場合:

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

awkの場合:

awk '!/^ *#/ && NF' file
  • !/^ *#/-#記号が後に続くスペースがない行を選択することを意味します
  • NF-空白でない行を選択することを意味します
  • &&-and演算子で、上記の両方が真である場合に行を出力します。
23
jaypal singh

これはおそらく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
8
Kevin

少しアップグレード

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

このコードは、空行またはスペースのみの行、#で始まる行、および#の前にスペースのみを含む行を除外します。

PS:^#^\s*#とは異なります

4
Mintaka

これはすべきです:

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%確実なわけではありません:ポンド記号(#)コメントを開始しません。つまり、エスケープされているか、文字列内にあります。まあ、何が起こるか想像できます。

3
gniourf_gniourf

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
grep ^[^#] filename
  • ^-行の始まり

  • [^#]-#を除外します。

行頭にスペースがある場合は機能しません。

2
tamerlaha

デフォルトのスペース区切り文字を使用する

  • 空行またはblankの行には空の$ 1しかありません
  • 最初の非空白¨charが#である行は、#で始まる$ 1を持つ

だから、シンプルに保つ

awk '$1 ~ /^[^#]/ ' YourFile
1
NeronLeVelu
sed -n '/^\s*[^#]\|^$/!'p filename

パターンは、行の先頭から始まり、#以外の文字が続く任意の量の空白(またはゼロ)と一致します。
または空の文字列(^と$の間に何もない)。
一致しないように、sedでは演算子(一致を反転)を使用できます。パターンは、正規表現が収まらないすべてのものに一致するようになりました。
したがって、-n(何も印刷しない)とpの組み合わせ(パターン)以外に一致するフラグ(印刷)行が印刷されます。

1
user176289

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

1
user3155841

Perlの場合:

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

これはC++コメントも無視します(//)

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

空行、#で始まる行、および#の前にスペースのみを含む行を除外します。

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

以下:

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

#で始まる行、空の行、および空白のみを含む行を標準出力に出力しないようにします。 |文字をエスケープする必要があることに注意してください。役立つことを願っています

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