为什么这个简单的正则表达式与我认为它应该匹配?

时间:2010-04-06 17:56:26

标签: regex grep

我有一个类似于以下示例的数据文件。我添加了'%'来代替标签控制字符\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,我都会得到相同的结果,所以我不确定它是不是shell的东西

4 个答案:

答案 0 :(得分:3)

显然\t不是egrep的特殊角色。您可以使用grep -P启用与Perl兼容的正则表达式引擎,也可以使用 Ctrl v Ctrl i插入文字标签

更好的是,您可以使用优秀的ack

答案 1 :(得分:0)

看起来shell在发送到egrep之前正在解析“\ t \ t \ t”。请尝试“\\ t \\ t”或“\ t \ t”。这是双引号中的两个斜线和单引号中的一个。

答案 2 :(得分:0)

该文件可能与您看到的完全不同。也许隐藏了控制字符。有时会发生这种情况。我的建议是你 debug 这个。首先,减少到匹配的最小正则表达式模式,然后逐个添加内容,直到找到问题:

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

该序列有不同的变化,具体取决于您在每个步骤中发现的内容。此外,第一步确实可以跳过,但这只是为了展示技术。

答案 3 :(得分:0)

你可以使用awk

awk '/^[[:alpha:]]\t\t/' file