sed+;删除“#&引用;使用一个sed命令和空行

sed+;删除“#&引用;使用一个sed命令和空行,sed,Sed,如何使用一个sed命令从文件中删除注释行(如#bal bla)和空行(不带字符的行) THX lidia如果出于性能原因,您担心在管道中启动两个sed进程,那么您可能不应该这样做,它仍然非常有效。但是,根据您希望进行就地编辑的注释,您仍然可以使用不同的命令(sed命令,而不是调用sed本身)进行编辑 您可以使用多个-e参数,也可以使用分号分隔命令,例如(仅使用其中一个,而不是两个): 下面的文字记录显示了这一点: pax> printf 'Line # with a comment\n\n

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

THX
lidia

如果出于性能原因,您担心在管道中启动两个
sed
进程,那么您可能不应该这样做,它仍然非常有效。但是,根据您希望进行就地编辑的注释,您仍然可以使用不同的命令(
sed
命令,而不是调用
sed
本身)进行编辑

您可以使用多个
-e
参数,也可以使用分号分隔命令,例如(仅使用其中一个,而不是两个):

下面的文字记录显示了这一点:

pax> printf 'Line # with a comment\n\n# Line with only a comment\n' >file

pax> cat file
Line # with a comment

# Line with only a comment

pax> cp file filex ; sed -i 's/#.*$//;/^$/d' filex ; cat filex
Line

pax> cp file filex ; sed -i -e 's/#.*$//' -e '/^$/d' filex ; cat filex
Line
请注意,即使使用两个
-e
选项,文件也是如何就地修改的。您可以看到这两个命令都在每一行上执行。带有注释的行首先删除注释,然后删除所有注释,因为它是空的


此外,原始空行也将被删除。

替代变量,使用grep:


cat file.txt | grep -Ev '(#.*$)|(^$)'
你可以用awk

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

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

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

如果还希望匹配完全为空白的行(空格、制表符等),请使用以下选项:

'/^\s*$/d'
'/^\s*#.*$/d'
(2)
的/#.*$/'
子句只匹配第0列中以
#
字符开头的行

如果还希望匹配在第一个
#
之前只有空格的行,请使用以下选项:

'/^\s*$/d'
'/^\s*#.*$/d'
上述标准可能不是通用的(例如,在HEREDOC块中,或在Python多行字符串中,不同的方法可能很重要),但在许多情况下,“空白”行的常规定义仅包括空白,而“注释”行则包括空白-

(3) 最后,至少在OSX上,@paxdiablo解决方案不起作用,其中第一个子句将注释行转换为空行,第二个子句将空行(包括最初的注释)。像我所做的那样,让这两个子句
/d
删除操作似乎更便于移植

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

sed -e '/^\s*#.*$/d' -e '/^\s*$/d' inputFile
在(其中一个)我的linux机器上,sed通过-r选项理解扩展正则表达式,因此:

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

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

第一个示例(paxdiablo)非常好,除了它的不更改文件,只是输出结果。如果要内联更改,请执行以下操作:


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

这颗小小的宝石会删除所有#注释,无论它们在一行中的什么位置开始:

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'

但是如果我想使用sed-I(how to integrated)cat file.txt | grep-Ev'(^#.$)|(^$)删除以“#”开头的行,这在保存原始文件方面是非常直观的。
grep-v-E'(#.$)|(^$)file.txt
——杀死无用的cat反模式!有没有办法将这两种模式结合成一种模式?我尝试了许多组合,但都不起作用。所以我想知道是否有办法,如果没有,为什么?谢谢改为使用#2会改变行为,就像这样的一行:
不评论#评论
,而之前变成:
不评论
(在
不评论
之间的所有空格保持不变),现在完全不动,并将评论保留在文件中。对我起作用的是:<代码> //s*y*.*$//'。“$
。我的正则表达式假设您没有嵌入
的多行字符串、HEREDOC块或类似内容,这可能是一个好的假设,也可能不是一个好的假设,但不会更改一行,除非它是完全空白的,或者直到第一行
都是完全空白的。您的应用程序将空格后面的任何内容都切掉-
,即使是在字符串中
#
经常用于格式化字符串,所以这看起来很危险。我运行了一个测试。帕斯迪亚布洛对克里斯·约翰逊。测试文件是squid.conf。squid.conf有1000多行注释用于15行配置。paxdiablo方法非常有效。它甚至删除了同一行中的配置旁边的注释。结果正是你所期望的,如果不是更好的话。竖起大拇指!克里斯·约翰逊改进的方法似乎删除了每一行带有#的内容,而不管#在行中的位置如何。导致不应删除的行被删除。不错,克里斯。我喜欢遵循的一条很好的格言是“如果它没有坏,就不要修理它”。