2010-04-06 32 views
4

我有一个数据文件,看起来像下面的例子。我添加了'%'来代替\t,这是制表符控制字符。为什么这个简单的正则表达式与我认为的不符?

1234:56% Alice Worthington 
alicew% Jan 1, 2010 10:20:30 AM% Closed% Development 
Digg: 
Reddit: 
Update%% file-one.txt% 1.1%  c:/foo/bar/quux 
Add%%  file-two.txt% 2.5.2% c:/foo/bar/quux 
Remove%% file-three.txt% 3.4%  c:/bar/quux 
Update%% file-four.txt% 4.6.5.3% c:/zzz 

... many more records of the above form 

我感兴趣的记录与“更新”开始,“添加”,“删除”等线路。我不知道这些线路是在什么时候开始的,或者它们之前有多少线路。我知道他们总是以一串字母开头,后面跟着两个标签。所以我写了这个正则表达式:

generate-report-for 1234:56 | egrep "^[[:alpha:]]+\t\t.+" 

但是这匹配零线。我哪里做错了?

编辑:我得到相同的结果我是否使用'...'"..."egrep表达,所以我不知道这是一个壳的事情。

回答

3

显然\t不是egrep的特殊字符。您可以使用grep -P,使Perl兼容的正则表达式引擎,或插入文字标签与按Ctrlv按Ctrl

更妙的是,你可以使用优秀的ack

+1

通过'cat -T'运行输出也是显示选项卡而不必手动替换它们的好方法,并建议此解决方案 – dsolimano 2010-04-06 18:10:40

0

它看起来像shell在发送给egrep之前解析“\ t \ t”。请改用“\\ t \\ t”或“\ t \ t”。这是双引号中的两个斜杠和单引号中的一个。

+0

我得到相同的(空白),结果两种方式。 – 2010-04-06 18:06:35

+0

也许不会吧? – 2010-04-06 18:08:18

+0

某些shell可以通过$'\ t'的字面标签,但将所有其他反斜杠加倍。如果\ t没有被你的grep识别,可能会有所帮助。 – drawnonward 2010-04-10 06:49:26

0

该文件可能不完全是你所看到的。也许有隐藏的控制字符。它有时会发生。我的建议是你调试这个。一是降低到与其匹配的最小正则表达式,然后保持一个添加的东西之一,直到找到问题:

egrep "[[:alpha:]]" 
egrep "[[:alpha:]]+" 
egrep "[[:alpha:]]+\t" 
egrep "[[:alpha:]]+\t\t" 
egrep "[[:alpha:]]+\t\t.+" 
egrep "^[[:alpha:]]+\t\t.+" 

还有一些对序列变异,这取决于你的每一步找出什么。另外,第一步可以真的被跳过,但这只是为了展示技术。

+0

仅供参考,egrep已弃用。 'grep -E'是首选 – ghostdog74 2010-04-06 23:56:26

+0

@ ghostdog74告诉Kevin,我跟它没有任何关系。但是,在FreeBSD的grep手册页中没有看到任何弃用通知。 – 2010-04-07 02:58:40

0

您可以使用AWK

awk '/^[[:alpha:]]\t\t/' file 
相关问题