2

我正在通过一些文件查找字符串“主机”(带单引号)。我想捕获包含没有注释 (#) 的字符串的文件。

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

两台服务器都是相当新的 Linux 版本。

什么可以解释第二个示例没有捕获文本?我知道我可以 grep for host,然后用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 ~]$
4

1 回答 1

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 版本,并选择适用于所有版本的语法。这个邮件列表帖子\s在 grep 2.5.1 中不起作用,但在 2.6.3 中起作用,所以你们中有一个 2.6.3 之前的版本,它可能不适用于\s.

于 2013-02-06T10:46:20.693 回答