我有一些很长的配置文件需要查看,我想看看只是文件中实际处于活动状态的是什么.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 写的方法,该方法仅显示第一列中没有注释的行。