tra-loi-cau-hoi-phat-trien-web.com

Làm cách nào để in một tệp, không bao gồm nhận xét và dòng trống, sử dụng grep/sed?

Tôi muốn in ra một tệp chứa một loạt các bình luận như:

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

Về bản chất, tệp chứa nhiều cấp độ thụt đầu dòng, trong đó một nhận xét bắt đầu bằng ký hiệu #

grep nên xóa các dòng trống và cả các dòng có ký hiệu băm trước văn bản (ngụ ý rằng đây là các nhận xét).

Tôi biết rằng các dòng trống có thể bị xóa qua: grep -v '^$'

Tuy nhiên, làm cách nào tôi có thể xóa các dòng có khoảng trắng hàng đầu và sau đó là ký hiệu # và chỉ in ra các dòng có mã thực tế? Tôi muốn làm điều này trong bash, sử dụng grep và/hoặc sed.

22
Joel G Mathew

Với grep:

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

Với awk:

awk '!/^ *#/ && NF' file
  • !/^ *#/ - có nghĩa là chọn các dòng không có khoảng trắng theo sau là ký hiệu # 
  • NF - có nghĩa là chọn các dòng không trống 
  • && - là toán tử and đảm bảo nếu cả hai điều trên đều đúng thì in dòng.
20
jaypal singh

Điều này có lẽ dễ dàng hơn với sed so với grep:

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

Hoặc với ERE:

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

Với ERE, grep cũng có thể thực hiện khá dễ dàng:

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

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

Mã cho 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

Nâng cấp nhỏ

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

Mã này loại trừ các dòng hoặc dòng trống chỉ có khoảng trắng, dòng bắt đầu bằng # và dòng không chứa gì ngoài khoảng trắng trước #.

PS: ^# khác với ^\s*# 

3
Mintaka

Điều này nên làm:

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

Trên đầu vào này:

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

bạn sẽ có được đầu ra này:

Hello everybody
This is a genuine line followed by a comment

Hãy cẩn thận. Loại phương pháp này không thể đánh lừa 100%: nếu bạn có dấu thăng (#) không bắt đầu nhận xét, tức là, nó đã thoát hoặc bên trong một chuỗi, bạn có thể tưởng tượng điều gì sẽ xảy ra.

2
gniourf_gniourf
grep ^[^#] filename
  • ^ - bắt đầu dòng

  • [^#]- loại trừ #.

Nếu bạn có khoảng trắng ở đầu dòng thì nó sẽ không hoạt động.

2
tamerlaha

Sử dụng dấu phân cách không gian mặc định

  • dòng trống hoặc dòng có trống chỉ có $ 1 trống
  • dòng không đầu tiên trống ¨char là #, có $ 1 bắt đầu bằng #

vì vậy, giữ cho nó đơn giản

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

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

1
user3155841

Với Perl:

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

Điều này cũng sẽ bỏ qua các bình luận C++ (//) 

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

Không bao gồm các dòng trống, các dòng bắt đầu bằng # và các dòng không chứa gì ngoài các khoảng trắng trước #.

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

Mẫu sẽ khớp với bất kỳ số lượng khoảng trắng (hoặc không) nào bắt đầu từ đầu dòng và theo sau bởi bất kỳ ký tự nào không phải là #
HOẶC chuỗi trống (không có gì ở giữa ^ và $).
Để KHÔNG khớp với nó, sed cho phép sử dụng! toán tử (khớp ngược). Bây giờ mẫu phù hợp với bất cứ điều gì mà biểu thức chính quy không phù hợp.
Do đó, với sự kết hợp của -n (loại bỏ việc in bất cứ thứ gì) và p cờ (in) phù hợp với bất cứ điều gì ngoại trừ mẫu sẽ được in.

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
Francisco Cabrera

Sau đây là

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

Sẽ ẩn các dòng bắt đầu bằng #, các dòng trống và các dòng chỉ chứa khoảng trắng được in ra cho thiết bị xuất chuẩn. Lưu ý rằng ký tự | phải được thoát. Mong rằng sẽ giúp 

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