sed +使用一个sed命令删除“#”和空行

时间:2010-07-28 05:49:20

标签: sed

如何使用一个sed命令从文件中删除注释行(如#bal bla)和空行(没有字符的行)?

THX 利迪娅

7 个答案:

答案 0 :(得分:31)

如果您担心在管道中启动两个sed进程而不是一个,那么您可能不应该这样做, 效率低。

但是,如果你想要一个进程,你可以使用多个-e参数,例如:

sed -e 's/#.*$//' -e '/^$/d' inputFile

为了回应您对为什么的评论,您想要一个进程,想要使用sed -i进行就地编辑,您仍然可以按照以下记录执行此操作:

pax> echo 'Line # with a comment' >qq
pax> echo >>qq
pax> echo '# Line with only a comment' >>qq
pax> cat qq
Line # with a comment

# Line with only a comment
pax> sed -i -e 's/#.*$//' -e '/^$/d' qq
pax> cat qq
Line
pax> _

注意即使有两个-e选项,文件也是如何就地修改的。您可以看到两条命令都在每一行上执行。带注释的行首先删除了注释,然后删除所有注释,因为它是空的。

此外,原来的空行也被移除。

答案 1 :(得分:13)

@paxdiablo有一个很好的答案,但可以改进。

(1)'/^$/d'子句仅匹配100%空行。

如果你想匹配完全空白的行(空格,制表符等),请改用:

'/^\s*$/d'

(2)'s/#.*$//'子句仅匹配以0列中的#字符开头的行。

如果你想在第一个#使用之前匹配只有空格的行:

'/^\s*#.*$/d'

上述标准可能不是通用的(例如在HEREDOC块内,或者在Python多行字符串中,不同的方法可能很重要),但在许多情况下,传统的定义是"空白"行包括仅限空格,以及"评论"行包括空格 - 然后 - #

(3)最后,至少在OSX上,@ paxdiablo解决方案中第一个子句将注释行转换为空行,第二个子句删除空白行(包括最初的注释)并不起作用。使这两个条款/d删除操作似乎更加便携。

包含上述内容的修订命令是:

sed -e '/^\s*#.*$/d' -e '/^\s*$/d' inputFile

答案 2 :(得分:5)

这个小宝石会删除所有评论,无论他们从哪一行开始:

sed -e 's/\s*#.*$//'

示例:

text="
this is a # test
#this is a test
#this is a #test
this is # another #test
"

$echo "$text" | sed -e 's/\s*#.*$//'

this is a


this is

接下来删除任何产生的空白行:

$echo "$text" | sed -e 's/\s*#.*$//' | sed -e '/^\s*$/d'

答案 3 :(得分:3)

替代变体,使用grep:


cat file.txt | grep -Ev '(#.*$)|(^$)'

答案 4 :(得分:1)

你可以使用awk

awk 'NF{gsub(/^[ \t]*#/,"");print}' file

答案 5 :(得分:0)

在我的linux框中(其中一个),sed使用-r选项理解扩展正则表达式,所以:

sed -r'/(^ \ s *#)|(^ \ s * $)/ d'squid.conf.installed

对于显示所有非空白的非注释行非常有用。 正则表达式匹配行的开头,后跟零个或多个空格或制表符,后跟哈希或行尾,并从输入中删除那些匹配的行。

答案 6 :(得分:0)

第一个例子(paxdiablo)非常好,除了它没有改变文件,只是输出结果。如果你想内联更改它:

sudo sed -i's /#.*$//;/^$/ d'inputFile