应用示例,查重复单词:
- 查多个文件,挑出包含重复单词的行,高亮标记,能知道来自哪行
- 可跨行查找
- 可不区分大小写,可间隔任意数量的各种空格
- 可查找被html tag分隔的重复单词 如 <b>very</b> very
egrep/sed
示例:
- ^(Subject|From): 以From:或者Subject:开头的行
- ip地址改字体 s!<H1>([0-9]+(\.[0-9]+){3})!<H2>$1</H2>!
- <H[123456]>匹配<H1><H2>等
- 匹配引号最简单的例子 "[^"]*"(不能处理中间存在转移引号的情况)
- 想用<.*>来匹配html中的tag是危险的,也会匹配到<I>shott</I>
- 时间如 9:17 am,[0-9]?[0-9]:[0-9][0-9] (am|pm)是不对的,应该是(1[012]|[0-9]):[0-5][0-9] (am|pm)
- 24小时制: ([01][0-9])|2[0-3]
Egrep元字符:
- 行的起始和结尾:^和$
- 形成习惯,不要认为^Cat匹配的是以Cat开头的行,而是Cat,只不过这个Cat位于行的开头。不是行,是单词。
- 字符组[]:
- 只有在[]内部,"-"才是元字符,如0-9,在外部,是普通字符。并且"-"放在开始时,是普通字符,如[-/.],在[0-9]是元字符。
- 字符组内部,"."是普通字符,在外部匹配任意字符
- 字符组内部,^表示非,在外部表示行的开始
- 注意:字符组必须匹配一个字符,即使是[^u]也必须匹配一个字符,只不过这个字符不是u。所以,如果Iraq后面的字符被截取掉了,q[^u]不会匹配;但如果Iraq后面有空格等,仍可匹配。
- 点号“.":匹配任何字符。
- 多选结构"|":
- Jeffery|Jeffrey 等同于 Jeff(ery|rey)、Jeff(er|re)y
- 忽略大小写:
- egrep命令行参数 egrep -i '^(From|Subject):' mailbox
- 单词分界符
- \<和\>。单词的开始和结束。
- 注意:实际上匹配的是位置
- 可选项元素"?"
- 其他量词: + *
- 括号及反向引用:
- egrep -i '\<([a-z]+) +\1\>' files
- 因为-i了所以无需[a-zA-Z]
- 两边加上\<和\>,中间的空格用+而不是*,相当于保障两个部分是独立的单词,不是其他单词的一部分
写正则表达式,需要在对欲检索文本的了解程度与检索精确性之间求得平衡。
Perl与egrep不属于一个正则流派
Per简单入门
- 变量以$开头,$a = 30; $b = $a * 5,可以保存一个数值或任意长度文本
- #作为注释
- 变量可以出现在双引号中,比如"一共$a元"
- 执行命令 % perl -w hellowworld. 类似于java
- if( $reply =~ m/^[0-9]+$/ ),其中=~ 是匹配运算符。(=是赋值、==是判断)
- $value = <STDIN> #从用户处接受一个输入
- chomp($value) 去掉$value后面的换行符
$1$2$3,从最左边的括号开始匹配。
[ \t]*和( *|\t*)的区别,后者不允许匹配空格和制表符的混合体。