linux正则表达式的学习

来源:互联网 发布:nokia5233软件下载 编辑:程序博客网 时间:2024/06/05 06:12

正则表达式分为:基本正则表达式和扩展正则表达式。

1.基础正则表达式的特殊符号:

. 小数点匹配任意单个字符
*,与前一个字符匹配 0 次或多次
\ ,转义字符,将特殊符号的特殊意义去除
[] ,左右方括号用于指定字符类,是一个集合,代表从字符集合里找到想要选取的字符,里面的字符是或的关系
[a-z],在字符类中使用一个连字符来表示一个范围
[^pattern] ,代表反向选择,当脱字符为字符类中的第一个字符时,它与字符集中字符以外的任何字符匹配
^pattern,定义在行首,当脱字符在字符类的外部时,脱字符匹配字符串的开头字符,匹配以XXX开头的内容
pattern$,匹配以XXX结尾的内容
{n}, {n} 匹配某个字符正好 n次
{n,} , {n,} 匹配某个字符至少n次,大于等于
{n,m} ,{n,m} 匹配某个字符至少n次,但不超过m次

 \<:锚点词首--相当于\b(匹配单词边界),用法格式\<pattern  \>:锚点词尾--用法格式\>pattern \<pattern\>:单词锚点 \?:匹配紧挨在前面的字符0次或1次

因为{}大括号、<>尖括号在shell里是有特殊意义的,所以要转义
grep 中的?代表特殊符号需要转义
egrep 中的?代表特殊符号不需要转义
例如:egrep -n ‘th?’

grep默认仅支持基础正则表达式
如果使用扩展正则表达式,使用grep -E ,egrop

2.扩展正则表达式的特殊符号:
+ ,与字符匹配 1 次或多次
?,问号,与字符匹配 0 次或 1 次
| 用或的方式找出数个字符串
() 找出组的字符串
()+ 找出重复组,一个以上
(), 当左括号和右括号用于正则表达式的各个组合部分时,它们为元字符。例如,(ab)* 匹配零个或多个 ab 的重复项

例子:
1.去除空白行
^$:匹配空白行
2.Java的注释(匹配位于 /* 和 */ 之间的 Java 注释,或者前缀为 // 的一行注释)

/\*.*\*/|//[^\n]*

特别注意:
.*代表 代表零个或多个任意字符的意思

3.过滤出以a为开头的任意文件
ls | grep -n ‘^a.*’

4.匹配Email地址:任意长度数字字母@任意长度数字字母.(com|org|net等等)

➜  ~ cat > email.txt << EOFheredoc> 5678967@qq.comheredoc> jie231@sina.cnheredoc> ken_tom@netcom.orgheredoc> jerry#li@baidu.netheredoc> li@souhu.netheredoc> EOF➜  ~ grep -E --color "^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$" email.txt5678967@qq.comjie231@sina.cnken_tom@netcom.orgli@souhu.net

练习:
1.查找特定字符串
2.利用中括号[]查找集合字符
3.行首与行尾字符^$
4.任何一个字符. 与重复字符*
5.限定练习RE字符范围{}

参考:
正则表达式语法
http://dcx.sybase.com/1101/zh/dbreference_zh11/rf-sqllanguage-s-4915351.html

正则表达式示例
http://dcx.sybase.com/1101/zh/dbreference_zh11/regexpexamples.html

未完待续……

知识点:
一.不同语系的编码数据并不相同,这就造成数据选取结果的区别。
例如:英文大小写的编码顺序,zh_CN.big5及C这两种语系的输出结果分别为:
LANG=C时:0123 ……ABCD……Zabcd……z
LANG=zh_CN时:01234……aAbBcCdD……zZ
使用正则表达式,需要留意当前环境的语系,否则可能会发现与别人不同的选取结果。可以利用特殊符号[:upper:]来替换编码范围较佳。

可以使用国际模式匹配的类名:
[[:upper:]] [A-Z]
[[:lower:]] [a-z]
[[:digit:]] [0-9]
[[:alnum:]] [0-9a-zA-Z]
[[:space:]] 空格或tab
[[:alpha:]] [a-zA-Z]

grep支持字符和字符集合
\d:数字字符匹配。等效于 [0-9]。
\s:匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。
\S:匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效
\w:匹配任何字类字符,包括下划线。与“[A-Za-z0-9_]”等效。
\W:与任何非单词字符匹配。与“[^A-Za-z0-9_]”等效。

查看本机的语系
➜ ~ echo $LANG
zh_CN.UTF-8
列出系统所有语系
➜ ~ locale -a

二.grep命令

grep(Globel Search Regular Expression and Printing out the line)全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,是一个对行进行操作的搜索工作,它能使用正则表达式搜索文本,并把匹配的行打印出来

Unix的grep家族包括grep、egrep和fgrep。

egrep表示扩展的grep,相比grep支持更多的元字符,”grep -E”相当于egrep。

fgrep是fast grep,不支持元字符,但是搜索速度更快。grep搜索的结果被送到屏幕,不影响原文件内容。

1、grep的语法[] (man grep查看grep的帮助文档)

grep    [options]    'pattern'     FILE命令      选项         模式        文件

grep不加引号直接过滤字符串;
grep在进行模式匹配的时候必须加引号,单引和双引号都可以;
grep在引用变量的时候必须加双引号

2、grep的选项[option]
-r:递归的搜索
-v:反向选取,只显示不符合模式的行
-o:只显示被模式匹配到的字符串,而不是整个行
-i:匹配时不区分大小写
-n:显示匹配行和行数
-A #:显示匹配到的行时,顺便显示后面的#行(#表示数值)
-B #:前面的#行
-C #:前后的#行
-E:使用扩展的正则表达式
eg:grep选项的例子

➜  ~ grepusage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]    [-e pattern] [-f file] [--binary-files=value] [--color=when]    [--context[=num]] [--directories=action] [--label] [--line-buffered]    [--null] [pattern] [file ...]

3.python 里的正则表达式
特殊字符
\d 匹配任何数字 和[0-9]一样
\D 匹配任何非数字
\w 匹配任何数字字母字符,和[A-Za-z0-9]一样
\W 匹配任何非数字字母字符
\s 匹配任何空白符,和[\n\t\r\v\t]一样
\S 匹配任何非空白符
\b 匹配单词边界
\B 匹配单词非边界
\A(\Z)匹配字符串的起始和结束

0 0
原创粉丝点击