进入正题前我们先假设这样一种场景,大家都知道过年回家的时候车票真的是一票难求,当你来到火车站正为此而焦虑不安的时候。忽然有个中年男人的声音在你耳边响起。问你要不要票。此时的你没想那么多因为你回家心切,多花了钱买了票,心里的石头终于落下了!于是你兴高采烈的去检票。但是很不幸!漂亮的检票小姐告诉你,你的票是假的时你却怎么也高兴不起来 ,虽然她看起来很漂亮。
那么好现在把你自己想像成一个文本,漂亮检票小姐是正则表达式,你要回家,检票小姐在你身上上下打量着,当然不是因为你长得帅。然后她说对不起你的身上没有qq两个字所以你又没去成你想去的地方。
说了这么多那么什么是正则表达式?正则表达式指的是由一些不是其字面意思的特殊字符组成的匹配指定内容的模版。可能你还是不甚清楚那么请看下图:
现在再说说元字符为了便于记忆和归纳我们用表格形式展示
以下将做详细解释
匹配单个字符:表示一定范围内的其中的一个字符
. 点号表示匹配任意单个字符
[ ] 匹配指定范围内的任意单个字符 例如:[0123] [a-z] [a-z0-9A-Z]
[^] 表示取反 例如[^0-9] 除了数字以外的单个字符 [^[:punct:]] 除标点符号外的任意单个字符
次数匹配元字符:指定它前面的字符出现的次数
位置定位
首先解释下词的含义:不包含特殊字符的连续字符组成的串叫单词
分组
同时\( \)中的内容会被保存在\n中 例如:\(ab\?\)c.*\1 则表示 abcqww44555ab而不表示acqww4455abc
说了这么多那么正则表达式到底有什么用呢?它需要与支持正则表达式的工具结合使用。例如文本检索工具grep 注意正则表达式与文件通配的区别 grep命令内有支持正则表达式的引擎也就是说他能够读懂正则表达式所书写的匹配模式的模版
Grep 用法: grep [选项] ‘正则表达式’ 文件
常用选项及含义:
-v: 反向选取
-o: 仅显示匹配的字串,而非字串所在的行
-i: ignore-case,忽略字符大小写
-E: 支持使用扩展正则表达式
-A #: 不仅显示匹配行还显示其后#个行
-B #: 不仅显示匹配行还显示其前#个行
-C #: 不仅显示匹配行还显示其前后#个行
下面结合示例描述grep与正则表达式的联合使用 为了便于理解grep有一个常用选项 --color=auto 此选项可将匹配的内容着色显示 为了便于使用:alias grep=‘grep --color=auto’
例1: 显示/etc/passwd文件所有的以root开头的行
grep ‘^root’ /etc/passwd
例2: 匹配文件中#号开头的行
grep "^#" /etc/profile
例3: 显示/etc/passwd文件所有小写字母组成的单词 注意单词的定义
grep ‘\<[[:lower:]]*\>‘ /etc/passwd
例4: 显示当前系统所有以用户名为shell的用户个数
首先匹配出符合此要求的用户然后计数
grep ‘^\(\<[[:alnum:]]*\>\).*\1$‘ /etc/passwd
计数
grep ‘^\(\<[[:alnum:]]*\>\).*\1$‘ /etc/passwd |cut -d: -f1 |wc -l
例5: 显示/etc/passwd文件所有一位或两位数
grep ‘\<[1-9][0-9]\?\>‘ /etc/passwd
例6: 匹配文件中的网址
文件内容 文件名为/html.txt
grep -o ‘http://\(\<[^[:punct:]]*\>\.\?\)*\(/[^[:space:]]*\)*‘ /html.txt
注意:实际情况要根据文本内容做相应的调整
执行命令后结果如图所示
以上内容难免会有错误 欢迎大家批评指正
本文出自 “梦想一克拉” 博客,请务必保留此出处http://centod.blog.51cto.com/9108378/1437592
原文地址:http://centod.blog.51cto.com/9108378/1437592