为什么在grep语句中冒号后面的空白字符在Bash中不起作用?

时间:2018-08-09 13:54:32

标签: regex bash grep

为什么下面的第一个grep语句无法返回结果,但是下面的修改后的grep语句有效呢?我也尝试过egrep,结果也一样。

cat test
ALL: 192.168.0.0/255.255.0.0, 10.0.0.0/255.0.0.0

grep '^[\s]*ALL[\s]*:[\s]*192.168.0.0/255.255.0.0[\s]*' test
No results

grep '^[\s]*ALL[\s]*: 192.168.0.0/255.255.0.0[\s]*' test
ALL: 192.168.0.0/255.255.0.0, 10.0.0.0/255.0.0.0

另外,当我在末尾加一个$时,两个都失败了。

grep '^[\s]*ALL[\s]*:[\s]*192.168.0.0/255.255.0.0[\s]*$' test
No results

grep '^[\s]*ALL[\s]*: 192.168.0.0/255.255.0.0[\s]*$' test
No results

1 个答案:

答案 0 :(得分:2)

保证

grep实现BRE-POSIX基本正则表达式。 \s在BRE中没有意义。 (某些OS供应商扩展了标准,有些则没有。)

使用[[:space:]]来代替某些东西。

在表达式的末尾添加$会使它失败,因为它与行的末尾匹配。您的行在匹配部分之后有一个额外的, 10.0.0.0/255.0.0.0,因此当然与$不匹配。您可以说.*$,但这将是多余的,除非您启用了-o/--only-matching标志。