egrep搜索或(|)和制表符(\ t)不起作用

时间:2016-01-28 07:59:58

标签: regex grep

有一个文件包含以下内容,

➜  ~  cat foo
123 456
1234    1234
123456789   12345678
123456789   12345678
12345678901234567890    12345678901234567890

并且只有第一列是9位数(\d{9})有效,所以我想grep那些无效行,首先我尝试下面的命令并且它不起作用

➜  ~   cat foo | egrep  $'^[0-9]{1,8}\t.*$ | ^[0-9]{10,}\t.*$'

没有输出。

然后我尝试了以下命令,这次它可以工作

➜  ~   cat foo | egrep  -v $'^[0-9]{9}\t.*$'
123 456
1234    1234
12345678901234567890    12345678901234567890

那么为什么第一个命令不起作用,哪里出错了?怎么能让它也有用呢?

1 个答案:

答案 0 :(得分:0)

您需要使用替代选项括号:

egrep  '(^[0-9]{1,8}[[:space:]].*$)|(^[0-9]{10,}[[:space:]].*$)' foo

但实际上,你的第二个表达更有意义。搜索不包含9个数字的行,而不是包含1-8个数字或10个或更多数字的行。此外,grep可以接受文件名参数;没有必要使用cat

看起来这就是你要找的东西:

egrep -v "^[0-9]{9}[[:space:]]" foo