首页 > 代码库 > linux笔记三 --正则表达式
linux笔记三 --正则表达式
前言:本篇博客的主要是记录学习过程中的正则表达式和sheel通配符。
内容:
1.shell通配符
通配符是基于bash解释器解析的,而正则表达式由正则引擎的软件(如awk,grep,sed等)解析,二者完全不同。
* | 表示匹配任意多个字符,0个到多个。 |
? | 表示匹配任意一个字符。 |
[] | 表示选择其中的一个匹配。 |
[-] | 表示匹配一个范围中的一个字符。如:[a-z]匹配到a-z中的一个。 |
[^]或[!] | 表示不匹配其中的任意一个。如:[^a-z]不匹配其中的任意一个 |
实例(此处实例参考其他博客)
[root@linux ~]# ls test* #那个 * 代表后面不论接几个字符都予以接受
[root@linux ~]# ls test? #那个 ? 代表后面"一定"要接"一个"字符
[root@linux ~]# ls test??? #那个 ??? 代表"一定要接三个"字符!
[root@linux ~]# cp test[1-5] /tmp # 将 test1, test2, test3, test4, test5 若存在的话,就拷贝到 /tmp
[root@linux ~]# cp test[!1-5] /tmp # 只要不是 test1, test2, test3, test4, test5 之外的其它 test?拷贝到 /tmp
[root@linux ~]# cd /lib/modules/`uname -r`/kernel/drivers # 系统先执行 uname -r 找出输出结果;将结果累加在目录上面,来执行 cd 的功能! = cd /lib/modules/$(uname -r)/kernel #另外,这个 quot (`) 的功能,也可以利用 $() 来取代喔!
[root@linux ~]# cp *[A-Z]* /tmp #表示文件中包含大写字母
[root@linux ~]# ls -lda /etc/*[35]* #表示文件中包含数字3或者5.
注意:通配符就好比全局变量在任何时候都能使用,但是如果遇到了vi,awk,grep,sed等软件,则使用正则表达式,通配符就不在使用
[[:alnum:]] =[0-9a-zA-Z]等等。这里可以参考linux学习笔记一
[[:xdigit:]]=[代表16进制的数字类型,包括0-9,A-F,a-f的数字与字符]
[[:graph:]] = [代表了除了空格和Tab键以外的所有按键]
[[:cntrl:]] =[代表了键盘上面的控制按键,即包括CR,LF,Tab,Del等]
2.基础正则表达式语法(RE语法):一个字符串如果是正则表达式表示的,则其中的任意字符被称为RE字符。
只支持普通正则表达式语法:^ $ . * \ [] " ‘
支持扩展正则表达式语法:^ $ . * \ [] " ‘ + ? | ()
标准的正则表达式:
基础RE字符 | 意义和实例 |
^string | 意义:以string为首的匹配行 实例:查找以root开头的匹配行 grep ‘^root‘ /etc/passwd |
$string | 意义:以string结尾的匹配行 实例:查找以数字结尾的匹配行 grep --color ‘[[:digit:]]$‘ /etc/inittab |
. | 意义:代表一定有一个任意字符的字符(除换行符),在awk中可匹配换行符 实例:查找r开始中间有两个字符,后面是一个t的行。 grep ‘r..t‘ /etc/passwd |
\ | 意义:转义字符,将特殊符号的特殊意义去除,将普通字符变为特殊字符。 范例:查找含有单引号‘的那一行 grep -n \‘ 008.txt |
* | 意义:重复0个到无穷多个前一个字符 范例:找出含有(ab)(aab)(acb)等的字符串,注意,因为*可以是0个,所以ab也是符合待查找字符串。另外,因为*为重复“前一个RE字符”的符号,因此在*之前一定要紧接着一个RE字符!例如任意字符则为.* grep -n ‘a*b‘ 008.txt |
[list] | 意义:从字符集合的RE字符里面找出想要选取的字符(不包括换行符),在awk中可以包含换行符。注意此时中括号里的\.*等特殊字符均变成一般字符(除了[])。 范例:查找含有(gl)或(gd)的那一行,需要特别留意的是,在[]当中代表一个待查找的字符,例如“a[ab]b”代表查找的字符串可以是aab,abb grep -n ‘a[ab]b‘ 008.txt |
[n1-n2] | 意义:从字符集和的RE字符里面找出想要选取的字符范围 范例:查找含有任意数字的那一行。需特别留意,在字符集合[]中的减号-是有特殊含义的,它代表两个字符之间的所有连续字符(与编码顺序有关) grep -n ‘a[a-z]b‘ 008.txt |
[^] | 意义:反向选择 范例:查找的字符串可以是(ab)(aab) grep ‘a[^c-z]‘ 008.txt |
\{n\} \{n,\}\{n,m\} | 意义:连续n到m个的前一个RE字符,若为\{n\}则是连续n个的前一个RE字符,若为\{n,\}则是连续n个以上的前一个RE字符 。 在支持扩展的正则表达式中用另一种形式,且n,m必须是0到255之间的整数: 注:本质上是扩展正则表达式的语法 grep ‘a\{1\}b‘ 008.txt 在b之前至少1个a grep ‘a\{2\}b‘ 008.txt 在b之前至少2个a grep ‘a\{1,2\}b‘ 008.txt 在b之前1-2个a grep ‘a\{1,\}b‘ 008.txt 在b之前至少1个a |
扩展的正则表达式:
grep需加-E (或者使用到扩展符号时加\)
sed需加-r (或者使用到扩展符号时加\)
awk,perl本身支持扩展这则表达式(也就是说awk中如果要引用(为普通字符要[(]如此使用。)
\+ | 意义:重复一个或一个以上的前一个RE字符(和\{1\}是有区别的,\+表示最大的匹配,而\{1\}是最小的匹配) 例如: grep ‘a\{1\}b‘ 008 ab aab aaab grep ‘a\+b‘ 008 ab aab aaab |
\? | 意义:零个或一个的前一个RE字符 和*的区别就是:?是最小匹配,*是最大匹配即匹配最长。 |
\| | 意义:用或(or)的方式找出数个字符串,两边的字符串不能加额外的空格, ABC|DEF表示ABC或DEF,A(BC|DE)F表示ABCF或ADEF grep ‘a\(a\|b\)b‘ 008 范例:去除空白行和行首为#的行grep -Env ‘^$|^#‘ regular_express.txt |
\(\) | 意义:找出“组”字符串,[]的引申 范例:查找glad或good这两个字符串,因为g与d是重复的,所以可以将la与oo以或的方式列于()中 grep -En ‘g(la|oo)d‘ regular_express.txt grep "l\(ik\|ov\)e" 008 |
()+ | 意义:重复一个或一个以上的前一个“组” |
{n} {n,} {n,m} | 与普通正则表达式含义一致,只是在支持扩展正则表达式中要用此形式,即awk、grep -E、sed -r 中使用 |
008文件内容: m a ab aab abb aaab acb amnb amnbc amnmnmnanb asb adb ‘dongzi‘ love is like like is love |
项目 | 正则表达式 |
匹配正规文本中的单词 | \b[[:alpha:]]\+\b(b是单词的边界) 或 ^[[:alpha:]]*$(注意此处的*不能换成?由于匹配长短问题,?是最短匹配) 可以匹配出空白行。 ^[[:alpha:]]+$就匹配不出空白行。 或 (^| )["({[]*book[]})"?,.:;!‘s ]*( |$) |
匹配空行 | ^$ |
匹配含有空格的空白行和空行 | ^空格*$ |
匹配整个行 | ^.*$ |
匹配一个或多个空格 | 空格空格* |
匹配s前面含有任意abc随机组合的字符串 | [abc]*s |
匹配格式化的美元数额 | \$[空格0-9]*\.[0-9][0-9] |
匹配电子邮件地址 | [[:alnum:]]*\@[[:alnum:]]*\.[[:alnum:]]\{2,4\}$ |
匹配一个HTTP URL | http://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4} |
本文出自 “天道酬勤” 博客,谢绝转载!
linux笔记三 --正则表达式