与Grep结果不一致

时间:2013-02-05 12:30:21

标签: regex grep

我正在浏览一些文件,查找字符串'host'(带单引号)。我想捕获没有注释(#)的字符串的文件。

第一个示例中的测试用例工作正常,但下面的第二个案例没有。第二种情况是我创建的测试文件,并插入了前导空格。所以我知道没有控制字符,只有空格。

这两个服务器都是Linux的最新版本。

第二个例子没有捕获文本的原因是什么?我知道我可以选择主机,然后使用 grep -v 过滤评论,但是我不明白这一点。

/home/user2> $ cat set.txt
   'host'
/home/user2> $ grep -E "^\s+'host'" set.txt
   'host'

另一台Linux服务器上的Grep无法捕获所需的数据:

[user1@wweb1 ~]$ cat set.txt
     'host'  
[user1@wweb1 ~]$ grep -E "^\s+'host'" set.txt
[user1@wweb1 ~]$

1 个答案:

答案 0 :(得分:0)

根据grep版本和类型,\s可能无效。在我的使用grep 2.12的系统上,没有提到\s,尽管它确实有效。其他版本可能没有启用此功能。

从手册页:

The Backslash Character and Special Expressions
   The symbols \< and \>  respectively  match  the  empty  string  at  the
   beginning and end of a word.  The symbol \b matches the empty string at
   the edge of a word, and \B matches the empty string provided  it's  not
   at the edge of a word.  The symbol \w is a synonym for [_[:alnum:]] and
   \W is a synonym for [^_[:alnum:]].

此外,man grep | grep "\\\\s"根本不返回任何内容。就是这样:没有提到\s

相反,您可以使用[:space:]

 user@pc $ grep -E "^[[:space:]]+'host'" set.txt
     'host'

请检查您的grep版本,并查看适用于所有版本的语法。 This mailing list post\s在grep 2.5.1中不起作用,但在2.6.3中有效,所以你有一个2.6.3之前的版本,它可能不适用于\s