正则表达式是一个小型的编程语言,最初它是在UNIX环境中开发的。Linux中也有同样的功能。
正则表达式由一些普通字符和一些元字符组成。
正则表达式语言是一种专门用于字符串处理的语言,比如我们在网页上用于验证邮件和电话号码的处理.
正则表达式元字符
元字符 | 描述 |
$ | 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。 |
^ | 锚定行的开始 如:'^grep'匹配所有以grep开头的行 |
. | 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。 |
* | 匹配零个或多个先前字符 如:'g*rep'匹配所有rep前面有0或者多个g的。 |
[ ] | 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。 |
[c1-c2] | 匹配从c1到c2之间的任何字符 |
[^c1-c2] | 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行。 |
| | 将两个匹配条件进行逻辑“或”(Or)运算。 |
\ | 引用符,相当于转意符。 |
\+ | 匹配1-任意个先前字符 |
\? | 匹配0-1个先前字符 |
\< \> | 匹配词(word)的开始(\<)和结束(\>)。 |
\{i} \{i,j} | 要指定特定数量的匹配,要使用大括号(注意必须使用反斜杠来转义)。想匹配所有10和100的实例而排除1和 1000,可以使用:10\{1,2\},这个正则表达式匹配数字1后面跟着1或者2个0的模式。在这个元字符的使用中一个有用的变化是忽略第二个数字,例如正则表达式0\{3,\} 将匹配至少3个连续的0。 |
\{i,} | 匹配i-任意个 |
\{,j} | 匹配0-j个 |
\( \) | 将 \( 和 \) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。 |
\w | 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。 |
\W | 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]。 |
\d | 匹配阿拉伯数字,等同于[0-9]。 |
\D | 匹配阿拉伯数字之外的任意字符,等同于[^0-9]。 |
\x | 匹配十六进制数字,等同于[0-9A-Fa-f]。 |
\X | 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]。 |
\t | 匹配空白字符。 |
\s | 匹配空白字符,等同于[ \t]。 |
\S | 匹配非空白字符,等同于[^ \t]。 |
注意1:『正规表示法的特殊字符』与一般在指令列输入指令的『万用字符』并不相同,例如,在万用字符当中, * 代表的是 0 ~ 无限多个字符的意思,但是在正规表示法当中, * 则是重复前一个字符的意思~使用的意义并不相同,不要搞混了!
注意2:使用规则表达式要养成良好的习惯,就是在匹配模式的两端加上‘’。这样和shell的文件通配符号做区别。
注意3:与Perl正则表达式的区别如下:
LINUX语法 | Perl语法 | 含义 |
\+ | + | 1-任意个 |
\? | ? | 0-1个 |
\{n,m} | {n,m} | n-m个 |
\(和\) | (和) | 分组 |
案例如下:
HTML标签 | <[^>]*> |
由26个英文字母组成的字符串 | ^[A-Za-z]+$ |
所有以char开头,之后是一个以上的空白, 最后是一个标识符和分号 | char\s\+[A-Za-z_]\w*; |
如 17:37:01 格式的时间字符串 | \d\d:\d\d:\d\d |
只有空白的行 | ^\s*$ |
匹配所有的four,但是fourteen中的four不匹配 | \<four\> |
开头和结尾处a的个数相同的字符串 | \(a\+\)[^a]\+\1 |
grep应用
说明:grep 是一个很常见的指令,最重要的功能就是进行字符串数据的比对了,需要说明的是『grep 在一个文件中查寻一个字符串时,他是以"整行"为单位来数据的撷取的!』
正则表达式在grep中的举例如下:
[root @test /root]# grep 'root' /var/log/secure
搜索 /var/log/secure 这个文件中包含 root 的行
[root @test /root]# grep -v 'root' /var/log/secure
搜索没有 root 的行
搜索 /var/log/secure 这个文件中包含 root 的行
[root @test /root]# grep -v 'root' /var/log/secure
搜索没有 root 的行
[root@localhost root]# ls -lh | grep d
drwxr-xr-x 2 root root 4.0K Dec 25 10:42 aaa
-rw-r--r-- 1 root root 1.2K Oct 25 10:05 anaconda-ks.cfg
[root@localhost root]# ls -lh | grep ^d
drwxr-xr-x 2 root root 4.0K Dec 25 10:42 aaa
增加^代表开头的意思
[root@localhost root]# ls -lh|grep ^.........x
drwxr-xr-x 2 root root 4.0K Dec 25 10:42 aaa
.代表单个字符的匹配
[root@localhost root]# ls -lh |grep g$
-rw-r--r-- 1 root root 1.2K Oct 25 10:05 anaconda-ks.cfg
-rw-r--r-- 1 root root 2.9K Nov 19 17:06 install.log
-rw-r--r-- 1 root root 2.9K Oct 25 10:03 install.log.syslog
$代表以什么字符结尾
显示当前目录下的一般文件的名字
ls -l |grep ^-
[root @test /root]# grep [A-Z]ANPATH /fig
grep 是最简单的正规表示法搜寻指令之一,他并不支持一些更严谨的正规表示法内容,不过,已经相当的好用。
继续举例:
例题一:出这个文件里面含有 know 这个字符,并将行号列出来:注意,大小写是不一样的
[root @test /root ]# grep -n 'know'
例题一:出这个文件里面含有 know 这个字符,并将行号列出来:注意,大小写是不一样的
[root @test /root ]# grep -n 'know'
例题二:出这个文件里面含有 * 这个字符,并将行号列出来:
[root @test /root ]# grep -n '\*'
[root @test /root ]# grep -n '\*'
例题三:我要将所有 know 不论大小写都列出来,并列出行号:
[root @test /root]# grep -ni 'know'
例题四:在 /etc 底下,只要含有 XYZ 三个字符的任何一个字符的那一行就列出来
grep [XYZ] /etc/*
例题五:我想要知道在 /etc 里面,只要句首是 w-z 的就将他印出来?
grep ^[w-z] /etc/*
VI应用
命令执行状态
%s/a/b/g
s表示替换,%表示整个文档(否则为当前光标),a 被查的字符串(正则匹配);b 要替换成的文字;g 表示全局搜索替换(否则只处理到的第一个结果)
案例:
在每一行头上加入一个空格 | %s/^/ / |
把一个或者多个空格替换为一个空格 | %s/\s\+/ /g |
去掉行尾的所有空格 | %s/ *$// |
去掉行首的所有数字字符 | %s/^[0-9][0-9]* // |
将所有的bag、beg、big和bog改为bug | %s/b[aeio]g/bug/g |
URL替换为<a href="url">url</a>的格式 | s/ \(http:\/\/[-a-z\._~\+%\/]\+\) /<a href="\1">\1<\/a> |
将 data1 data2 修改为 data2 data1(在VI或者sed中) | s/ \(\w\+\)\s\+\(\w\+\) / \2\t\1 |
注意:vi的 &用法
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
相当于:
相当于:
:%s/\(love\)/**\1**/
sed应用
sed用于对文本进行处理,它的很多方面都类似于vi。
sed命令语法为:sed [options] 'command' file(s)
其中command相当于vi中的command模式下的命令
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由屏幕输出。
常用命令:
a∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s∶替换!例如 1,20s/old/new/g 表示从1到20行,用new替换old,全局替换,这个与vi的命令一摸一样。
举例:(假设我们有一文件名为在常用的正则化计算方法中 属于a),内容为:
Hello!
ruby is me,welcome to my blog.
end
删除某行
[root@localhost ruby] # sed '1d' ab #删除第一行
[root@localhost ruby] # sed '$d' ab #删除最后一行
[root@localhost ruby] # sed '1,2d' ab #删除第一行到第二行
[root@localhost ruby] # sed '2,$d' ab #删除第二行到最后一行
显示某行
. [root@localhost ruby] # sed -n '1p' ab #显示第一行
[root@localhost ruby] # sed -n '$p' ab #显示最后一行
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论