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.
Với grep
:
grep -v '^$\|^\s*\#' temp
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.Đ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
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
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*#
Đ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.
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.
Sử dụng dấu phân cách không gian mặc định
vì vậy, giữ cho nó đơn giản
awk '$1 ~ /^[^#]/ ' YourFile
egrep -v '^$|^#' /etc/sysctl.conf
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
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 #.
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.
#!/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
#####
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
grep -v '^$\|^#\|^\s*\#' filename | grep -v "^[[:space:]]*$" | more