我想打印出一个包含一系列评论的文件,如:
</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。
答案 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:
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)
使用默认空格分隔符
所以,保持简单
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
匹配任何前导空格,然后匹配任何字符#