如何使用一个sed命令从文件中删除注释行(如#bal bla)和空行(没有字符的行)?
THX 利迪娅
答案 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