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

lid*_*dia 23 sed

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

THX lidia

pax*_*blo 33

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

但是,如果您确实需要单个进程,则可以使用多个-e参数,例如:

sed -e 's/#.*$//' -e '/^$/d' inputFile
Run Code Online (Sandbox Code Playgroud)

为了回应您对单个进程的原因的评论,想要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> _
Run Code Online (Sandbox Code Playgroud)

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

此外,原始空行也被删除.

  • 不需要多个`-e`参数.一旦可以添加一个`;`来执行多个动作.即`sed'/^[#;].*$/ d;/^ $/d'` (7认同)

Chr*_*son 13

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

(1)该'/^$/d'条款仅匹配100%的空白行.

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

'/^\s*$/d'
Run Code Online (Sandbox Code Playgroud)

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

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

'/^\s*#.*$/d'
Run Code Online (Sandbox Code Playgroud)

上述标准可能不是通用的(例如,在HEREDOC块内,或者在Python多行字符串中,不同的方法可能很重要),但在许多情况下,"空白"行的常规定义仅包括空格,并且"注释"行包括空格 - 然后 - #.

(3)最后,至少在OSX上,@ paxdiablo解决方案,其中第一个子句将注释行转换为空行,第二个子句剥离空行(包括最初的注释)不起作用.似乎更容易使两个子句/d删除操作,就像我已经完成的那样.

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

sed -e '/^\s*#.*$/d' -e '/^\s*$/d' inputFile
Run Code Online (Sandbox Code Playgroud)


Ell*_*iew 5

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

sed -e 's/\s*#.*$//'
Run Code Online (Sandbox Code Playgroud)

例:

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
Run Code Online (Sandbox Code Playgroud)

接下来,这将删除任何结果空行:

$echo "$text" | sed -e 's/\s*#.*$//' | sed -e '/^\s*$/d'
Run Code Online (Sandbox Code Playgroud)