正则表达式是一个小型的编程语言,最初它是在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 的行
[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'
例题二:出这个文件里面含有 * 这个字符,并将行号列出来:
[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 动作;
        -rsed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
        -i∶直接修改读取的档案内容,而不是由屏幕输出。       
常用命令:
        a∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
        c∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
        d∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
        i∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
        p∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
        s∶替换!例如 1,20s/old/new/g 表示从120行,用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小时内删除。