为什么grep'[^ a-z] + $'匹配数字?

时间:2013-07-26 04:29:08

标签: regex grep

你能解释为什么正则表达式“grep -E'[^ a-z] + $'testfile”也匹配只包含数字的行吗?

例如对于testfile:

Hi
this 
is test file
123 456
asdf
ASDF

此表达式将匹配:

123 456
ASDF

同时“grep ^ [a-z] + $”按预期匹配行:

this
asdf

3 个答案:

答案 0 :(得分:3)

[^a-z]表示“不在a-z范围内的任何字符”。字符类^开头的[]会反转字符类。

也许你的意思是^[a-z]+$

答案 1 :(得分:1)

您的输出不正确。它只会匹配123 456。在字符类^中使用[]用于否定。

对于锚定,您需要在字符类之外使用^

答案 2 :(得分:1)

问题

  1. 发布时,您的语料库有前导空格。
  2. 你的角色类错了;你没有用克拉来固定班级,你已经否定了班级。
  3. 解决方案

    使用POSIX字符类来处理前导空格,以及仅匹配行的其余部分中的数字和空格。

    $ grep -E '^[[:space:][:digit:]]+$' /tmp/corpus 
     123 456