我有一个类似于以下示例的数据文件。我添加了'%'来代替标签控制字符\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的东西
答案 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