删除与 grep 中的字符串匹配的行

删除与 grep 中的字符串匹配的行

我有一些很长的配置文件需要查看,我想看看只是文件中实际处于活动状态的是什么.conf,没有任何标签#。我可以使用什么来输出行没有#上面有吗?我正在用这个命令运行 Debian Wheezy。

答案1

如果文件名为foo.conf

grep -E '^[^#].*' foo.conf应该这么做。

解释:

-E:支持扩展正则表达式!

'^[^#].*':单引号括起来的正则表达式。

^[^#].*:正则表达式本身。

^(在正则表达式的位置 0):表示“从行首/换行符后的第一个字符或文件本身的第一个字符开始匹配。”

[^#]: 表示“匹配一个字符不是人物#。”

.*:表示“匹配零个或多个任何除了换行符之外的字符,用于该行的其余部分。”

最终结果是,如果您有一个包含以下内容的文件:

#foo
bar
#baz
fly

此正则表达式将匹配失败第一行和第三行,因为第 1 行和第 3 行开头的第一个字符实际上是,所以正则表达式中只需要一个非( )#的部分匹配失败,因此排除该行。#[^#]grep

然后正则表达式将成功匹配其余行,因为第 2 行和第 4 行开头的第一个字符确实是不是A #

基于我们迄今为止的成功,您还可以匹配如下线路:

    #I am tricky!

(请注意空格(制表符或空格)位于注释前面,并且由于它仍然是注释,所以我们不想要它!)

使用以下命令:

grep -P '^\s*+[^#].*' foo.conf

(但.*并非严格要求;我知道,我知道。)

现在我们有:

-P: 支持Perl 兼容正则表达式!(提示:可能并非在所有版本/实现中都可用grep,但至少在 GNU Grep 中暂时可用。)

\s*+:添加的正则表达式的一点内容是,“匹配零个或多个空白字符,即空格或制表符,如果你看到它们,你必须吃掉它们。”后一部分非常重要,因为如果没有所有格量词*+,空格可能会作为的一部分匹配[^#],这会欺骗正则表达式。POSIX 兼容(基本或者由于我们无法使用扩展正则表达式,因此我们必须在此处使用 PCRE。也许有一种方法可以在不使用所有格量词的情况下做到这一点,但我不知道。

答案2

grep -v '#' file

您需要引用 #,因为您的 shell 可能也将其解释为注释。

grep 将删除任何带有 # 的行。这可能不是您想要的。删除注释可能更有用。您可以使用 sed 或“Stream EDitor”。这可能会给您想要的结果。

sed -e 's/#.*//' < file | less

正则表达式表示“从注释字符到行尾查找,并将其删除”,然后通过管道传输到 less 以便更轻松地读取它。

如果注释总是在第一列,您可以使用@somequixotic 写的方法,该方法仅显示第一列中没有注释的行。

相关内容