linux/unix下使用正则表达式的命令:grep sed awk perl(这种语言是目前最大的正则表达式引擎)
1.正则表达式:Regular Expression
正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
通常在文本中(数据集)被用来检索、替换那些符合某个模式(规则)的文本。
2.为什么使用正则表达式?
典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。
虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。
通过使用正则表达式,可以:测试字符串内的模式。例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。
替换文本。可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
基于模式匹配从字符串中提取子字符串。可以查找文档内或输入域内特定的文本。
例如,您可能需要搜索整个网站,删除过时的材料,以及替换某些 HTML 格式标记。在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记。此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换标记。
3.正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、
将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
======================================
不允许诸如 ^* 之类的表达式。
======================================
特殊字符:一些特殊含义的字符,如果要查找含有特殊字符的字符串,需要加转义字符
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 $。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
- 匹配前面的子表达式0次或1次,多次。要匹配 * 字符,请使用 *。(贪婪算法)
- 匹配前面的子表达式1次或多次。要匹配 + 字符,请使用 +。(贪婪算法) 例如runoo+b,可以匹配 runoob、runooob、runoooooob 等
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 .
? 匹配前面的子表达式0次,1次,或指明一个非贪婪限定符+?。要匹配 ? 字符,请使用 ? 例如colou?r 可以匹配 color 或者 colour,
[ 标记一个中括号表达式的开始。要匹配 [,请使用 [。
字符集合 [a-z|A-Z|0-9]
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\’ 匹配 “”
^ 匹配输入字符串的开始位置,但是在方括号表达式中使用时表示取非。要匹配 ^ 字符本身,请使用 ^
{ 标记限定符表达式的开始。要匹配 {,请使用 {
以前一个字符为参照,代表该字符连续出现的频率 {n} 或 {n,} 或 {n,m}
| 指明两项之间的一个选择。要匹配 |,请使用 | 只在[]中不需要加转义符\
======================================
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
正则表达式的限定符有:
字符 描述
- 匹配前面的子表达式零次或多次。 但是在通配符*:以左右作为参照出现1次或者多次
- 匹配前面的子表达式一次或多次。
? 匹配前面的子表达式零次或一次。
{n} n 是一个非负整数。匹配确定的 n 次。 例如’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。 例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。
{n,m} m 和 n 均为非负整数,其中n<=m最少匹配n次且最多匹配m次。 例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o
======================================
定位符:定位符用来描述字符串或单词的边界
^ 和 $ 分别指字符串的开始与结束
\b 匹配所有单词的前或后边界 例如在never verb 使用 er\b 可以到nerver
\B 匹配所有非单词边界。
\c 匹配控制字符
\f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
\v 匹配一个垂直制表符
\d 匹配所有的数字字符,等价[0-9]
\D 匹配所有的非数字字符,等价[^0-9]
\w 匹配所有含有下划线_的有效字符集 等价于[a-zA-Z0-9_]
\W 等价于[^a-zA-Z0-9_]
\1 指定第一个子匹配项
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
==============================================================================
运算符优先级
运算符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,"或"操作字符具有高于替换运算符的优先级,
使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。
======================================
grep 常用参数:
-c:只显示匹配行数
-i:不区分大小写
-h:匹配多文件时不显示文件名
-s:不显示正则表达式出现的错误信息
-v:显示所有的非匹配内容
-l:显示包含匹配内容的文件名
(1)查找以h开头,o结尾的字符串:grep "^h.*o$" filename
(2)只要zood和good的字符串:grep "^[z|g]ood$" filename
(3)查找合法的手机号码:规则:11位纯数字,以1开头,第二位3-9之间,数字尾
grep "^1[3-9][0-9]\{9\}$" filename
(4)匹配邮箱:grep "^[a-z|A-Z|0-9]\+@[a-z|A-Z|0-9]\+\.\(com\|net\|cn\)$" filename
(5)html源码中找到所有的a标签
标签形式:<a href = "https://news.sina.com/12.shtml"> </a>
-c只显示条数:grep -c "<a.\+>.\+</a>" world.html
想查询新闻链接:新闻链接一般是shtml结尾
grep -c '<a.\+href=".\+\.shtml".\+>.\+</a>' xx.html
+?非贪婪模式向后取一次或多次
grep -c '<a[^>]\+\?href="[^"]\+\?\.shtml"[^>]\+\?>[^<]\+\?</a>' xx.html