shell 正则表达式详解

目录

正则表达式

一,什么是正则表达式

二,为什么使用正则表达式

三,如何使用正则表达式

示例:

四,基本正则表达式

基本正则表达式示例:

正则表达式字符集示例:

五,扩展正则表达式

扩展正则表达式示例:

扩展:


正则表达式

一,什么是正则表达式

       正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单的说,正则表达式就是用在字符串的处理上面的一项表示式。由于正则表达式语法简练,功能强大,得到了许多程序设计语言的支持,包括Java、C++、Perl以及Shell等。

二,为什么使用正则表达式

        在进行程序设计的过程中,用户会不可避免地遇到处理某些文本的情况。有的时候,用户还需要查找符某些比较复杂规则的字符串。对于这些情况,如果单纯依靠程序设计语言本身,则往往会使得用户通过复杂的代码来实现。但是,如果使用正则表达式,则会以非常简短的代码来完成。

三,如何使用正则表达式

       当一个正则表达式完成之后,并能够保证这个表达式一定是准确的,需要不断地测试才可以确定其正确 与否。在不同的环境下,用户需要不同的工具来帮助他完成测试的过程。如果是在Shell命令行中,用户 可以使用grep命令来测试。

 grep家族有三大成员分别为

 grep:支持使用基本正则表达式。

 egrep:支持使用扩展正则表达式。

fgrep:不支持使用正则表达式,即所有的正则表达式中的元字符都将作为一般字符,仅仅拥有其字面 意义,不再拥有特殊意义。

     grep命令的名称来自于全局搜索正则表达式并打印文本行(Global Search Regular Expression and Print out the line)的缩写。它是一个非常古老的UNIX命令,也是一种强大的文本搜索工具。grep命令 使用正则表达式来搜索文本,并且把匹配的文本行打印出来。

     grep命令根据用户指定的”pattern(过滤条件)“对目标文本逐行进行匹配检查;打印出符合条件的 行,即文本搜索工具。注:PATTERN即过滤条件指由文本字符及正则表达式元字符所编写的字符串。

 grep命令的基本语法如下:grep [options] pattern [file…]

     在上面的语法中,options表示选项,选项列表如下表。pattern表示要匹配的模式,file表示一系列的文 件名。grep命令会从一个或者多个文件中搜索满足指定模式的文本行,并且打印出来。模式后面的所有的字符串参数都被看作是文件名。

示例:

1,  -n :    显示行号

[root@wangjingjing ~]# ls -l | grep -n num

21:-rw-r--r--. 1 root root  222 Feb  1 17:53 num_script.sh

2,  -o :    只显示匹配的内容

[root@wangjingjing ~]# ls -l | grep -o num

num

3,  -q :   静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容

[root@wangjingjing ~]# ls -l | grep -q num
[root@wangjingjing ~]# echo $?
0


4,  -A :   如果匹配成功,则将匹配行及其后n行一起打印出来

[root@wangjingjing ~]# ls -l | grep num -A 2

-rw-r--r--. 1 root root  222 Feb  1 17:53 num_script.sh

drwxr-xr-x. 2 root root    6 Dec 31 19:16 Pictures

drwxr-xr-x. 2 root root    6 Dec 31 19:16 Public

5,   -B :    如果匹配成功,则将匹配行及其前n行一起打印出来

[root@wangjingjing ~]# ls -l | grep num -B 2
-rw-r--r--. 1 root root    0 Jan 30 11:37 newfile
-rw-r--r--. 1 root root  171 Jan 30 21:55 newfile.sh
-rw-r--r--. 1 root root  222 Feb  1 17:53 num_script.sh

6,   -C :    如果匹配成功,则将匹配行及其前后n行一起打印出来

[root@wangjingjing ~]# ls -l | grep num -C 2

-rw-r--r--. 1 root root    0 Jan 30 11:37 newfile

-rw-r--r--. 1 root root  171 Jan 30 21:55 newfile.sh

-rw-r--r--. 1 root root  222 Feb  1 17:53 num_script.sh

drwxr-xr-x. 2 root root    6 Dec 31 19:16 Pictures

drwxr-xr-x. 2 root root    6 Dec 31 19:16 Public

7,   -c :如果匹配成功,则将匹配到的行数打印出来 (统计行数)

[root@wangjingjing ~]# ls -l | grep -c num
1

--color:     高亮颜色显示匹配到的字符串

--color=never没有颜色

--color=always

--color=auto自动的颜色

-E:  支持扩展中的表达式

-e:支持基本的正则表达式

-P: Perl的正则表达式的支持

8,   -o:只输出匹配到的内容

[root@wangjingjing ~]# ls -l | grep  function

-rw-r--r--. 1 root root  682 Feb  3 12:07 function_script.sh

[root@wangjingjing ~]# ls -l | grep -o  function

function

9,   -v :取反,不匹配

[root@wangjingjing ~]# ls -l | grep -v  function

total 72

-rw-r--r--. 1 root root  331 Feb  1 20:22 99table_script.sh

-rw-------. 1 root root 1272 Dec 31 19:14 anaconda-ks.cfg

-rw-r--r--. 1 root root  215 Jan 31 15:27 arg_script.sh

-rw-r--r--. 1 root root  332 Jan 31 15:28 args_script.sh

drwxr-xr-x. 2 root root   36 Jan  1 11:00 at230101

drwxr-xr-x. 2 root root  116 Jan  8 18:15 ca_learning

10,   -w:匹配单词

[root@wangjingjing 0202]# grep -w hello file.txt

hello

hello world

四,基本正则表达式

        基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式,是最早制订的正则表达 式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之 一,另外一种语法标准称为扩展正则表达式。

基本正则表达式示例:

1,   ^ 在每行的开始进行匹配

匹配以123为开头的

[root@wangjingjing ~]# echo "123 456 789" | grep ^123

123 456 789

[root@wangjingjing ~]# echo "123 456 789" | grep ^456

[root@wangjingjing ~]#

2,   $ 在每行的末尾进行匹配

匹配以789结尾的

[root@wangjingjing ~]# echo "123 456 789" | grep 789$

123 456 789

[root@wangjingjing ~]# echo "123 456 789" | grep 456$

[root@wangjingjing ~]#

 

3,     . 对任何单个字符进行匹配

匹配ab后面连着任意一个字符

[root@wangjingjing 0202]# echo "abcdabef" | grep ab.

abcdabef

匹配ab后面连着任意2个字符

[root@wangjingjing ~]# echo "abcdabcdabcd" | grep a..

abcdabcdabcd

4,     *(量词) 对前一项进行0次或多次重复匹配

尽可能多的去匹配(成功的前提下)

多次a

[root@wangjingjing ~]# echo "aaabbbccc" | grep "a*"

Aaabbbccc

0次a

[root@wangjingjing ~]# echo "bbbccc" | grep "a*"

bbbccc

5,       [str] 对str中的任何单个字符进行匹配

6,        [a-b] 对a到b之间的任何字符进行匹配

[root@wangjingjing ~]# echo "a" | grep [a-z]

a

[root@wangjingjing ~]# echo "7" | grep [0-9]

7

[root@wangjingjing ~]# echo "m" | grep [a-z]

m

7,     [^str] 对任何不在str中的单个字符进行匹配

匹配,abc的补集

[root@wangjingjing 0202]# echo "a" | grep [^abc]

[root@wangjingjing 0202]# echo "m" | grep [^abc]

m

8,     \ 忽略后面一个字符的特殊含义

取消.的特殊意义

[root@wangjingjing ~]# echo "3a14" | grep "^3.14"

3a14

[root@wangjingjing ~]# echo "3a14" | grep "^3\.14"

[root@wangjingjing ~]#

 注意:grep要将{}转义,\{\},egrep不需要转义

9,    a{n}: a重复指定的次数

[root@wangjingjing 0202]# echo "aaaaaaaa" | grep 'a\{5\}'

aaaaaaaa

[root@wangjingjing 0202]# echo "aaaaaaaa" | egrep 'a{5}'

aaaaaaaa

10,   a{n,m}: 重复n-m(贪婪的)

对a第一次匹配(重复)5次,第二次匹配三次

[root@wangjingjing 0202]# echo "aaaaaaaa" | grep 'a\{2,5\}'

aaaaaaaa

11,    a{n,}: 最少重复n次,最多没有限制

贪婪的,重复最多次

[root@wangjingjing 0202]# echo "aaaaa" | grep 'a\{2,\}'

aaaaa

12,    a{,m}:最多重复m次,最少没有限制

[root@wangjingjing 0202]# echo "aaaaa" | grep 'a\{,2\}'

aaaaa

13,    \(\),定义子表达式的开始和结束位置。

匹配abcd

[root@wangjingjing 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)'

abcdefbcdcdd

匹配abcdef,组1

[root@wangjingjing 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)ef\1'

abcdefbcdcdd

匹配abcdefbcd(组1)cd(组2)

[root@wangjingjing 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)ef\1\2'

abcdefbcdcdd

14,    \\b:锚定词尾(支持vigrep),其前面的任意字符必须作为单词尾部出现,

只匹配单词的首尾,不包括特殊符号,除了.   ?

[root@wangjingjing 0202]# echo "hello" | grep '\bhello\b'

hello

[root@wangjingjing 0202]# echo "helloo" | grep '\bhello.\b'

helloo

贪婪:尽可能多的去匹配(大前提:匹配成功)

a*: 0-任意多

a?:0-1

a+:1-任意

a{n,m}: n-m

正则表达式字符集

正则表达式字符集示例:

1,    [[:alnum:]] 匹配任意一个字母或者数字,等价于[A-Za-z0-9]

[root@wangjingjing 0202]# echo "hello123" | grep '[[:alnum:]]*'
hello123

[root@wangjingjing 0202]# echo "hello123" | grep '[a-zA-Z0-9]*'

hello123

2,     [[:alpha:]] 匹配任意一个字母,等价于[A-Za-z]

[root@wangjingjing 0202]# echo "hello123" | grep '[[:alpha:]]*'

hello123

[root@wangjingjing 0202]# echo "hello123" | grep '[a-zA-Z]*'

hello123

3,     [[:digit:]] 匹配任意一个数字,等价于[0-9]

[root@wangjingjing 0202]# echo "hello123" | grep '[[:digit:]]*'

hello123

[root@wangjingjing 0202]# echo "hello123" | grep '[0-9]]*'

hello123

4,     [[:lower:]] 匹配任意一个小写字母,等价于[a-z]

[root@wangjingjing 0202]# echo "Hello123" | grep '[[:lower:]]*'

Hello123

[root@wangjingjing 0202]# echo "Hello123" | grep '[a-z]*'

Hello123

5,    [[:upper:]] 匹配任意一个大写字母,等价于[A-Z]

[root@wangjingjing 0202]# echo "Hello123" | grep '[[:upper:]]*'

Hello123

[root@wangjingjing 0202]# echo "Hello123" | grep '[A-Z]*'

Hello123

6,     [[:space:]] 匹配任意一个空白符,包括空格、制表符、换行符以及分页符

空格

[root@wangjingjing 0202]# echo "Hello    123" | grep '[[:space:]]*'

Hello    123

制表符(占8位)

[root@wangjingjing 0202]# echo -e "Hello\t\t\t123" | grep '[[:space:]]*'

Hello                        123

换行符(grep   -z 选线)

[root@wangjingjing 0202]# echo -e "Hello\n\n123" | grep -z '[[:space:]]*'

Hello

123

五,扩展正则表达式

       扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。前面介绍的元字符“^”、“$”、“.”、“*”、 “[]”以及“[^]”这6个元字符在扩展正则表达式都得到了支持,并且其意义和用法都完全相同,不再重复介绍。接下来重点介绍一下在扩展正则表达式中新增加的一些元字符。

扩展正则表达式示例:

1,+   对前一项进行1次或多次重复匹配

[root@wangjingjing 0202]# echo "sssssss" | grep  -E 's+'

sssssss

2,     ?    对前一项进行0次或1重复匹配

[root@wangjingjing 0202]# echo "sssssss" | grep  -E 's?'

sssssss

3,    匹配单独的a

[root@wangjingjing 0202]# echo "sssssss" | grep  -E 's*?'

sssssss

非贪婪:尽可能少的去匹配

a*?

a+?

a??

a{n,m}?

扩展:

1,     (?:):分组的非捕获版本

加了?:的不参与分组

[root@wangjingjing 0202]# echo "abcdefgbcd" | grep -Po 'a(?:b(c(d)))efg\1'

加了?:的不参与分组,组名顺延

[root@wangjingjing 0202]# echo "abcdefgcd" | grep -Po 'a(?:b(c(d)))efg\1'

abcdefgcd

2,         给分组命名      ?p<组名>        ?p=组名)

[root@wangjingjing 0202]# echo "abcdefgbcd" | grep -Po 'a(?P<g1>b(c(d)))efg(?P=g1)'

abcdefgbcd

3,     ?#注释,里面的内容不参与匹配

[root@wangjingjing 0202]# echo "abcdefgbcd" | grep -Po 'a(?#express)(b(c(d)))efg\1'

abcdefgbcd

4,(?=: 不消耗样式 lookahead assertion: 前视断言:他是一个判定条件,但是不作为结果范围,也不消耗内容

去匹配,要获取的是windows,但是只能是windows10的时候获取windows

[root@wangjingjing 0202]# echo "windows10" | grep -Po "windows(?=10)"

windows

[root@wangjingjing 0202]# echo "windows10" | grep -Po "windows(?=10)10"

windows10

[root@wangjingjing 0202]# echo "windows98" | grep -Po "windows(?=10)"

[root@wangjingjing 0202]#

5,      (?!…)  negative lookahead assertion: 前视预断言取反

去匹配,要获取的是windows,但是只能不是windows10的时候获取windows

[root@wangjingjing 0202]# echo "windows10" | grep -Po 'windows(?!10)'

[root@wangjingjing 0202]# echo "windows98" | grep -Po 'windows(?!10)'

windows

[root@wangjingjing 0202]# echo "windows98" | grep -Po 'windows(?!10)98'

windows98

6,       (?<=…): positive lookbehind assertion: 后视断言

只有windows前边是10的时候,才匹配成功,也是返回windows

ot@wangjingjing 0202]# echo "10windows" | grep -Po '(?<=10)windows'

windows

[root@wangjingjing 0202]# echo "10windows" | grep -Po '10(?<=10)windows'

10windows

[root@wangjingjing 0202]# echo "10windows" | grep -Po '98(?<=10)windows'

[root@wangjingjing 0202]#

7,       (?<…): positive lookbehind assertion: 后视断言取反

只有windows前边是10的时候,才匹配成功,也是返回windows

[root@wangjingjing 0202]# echo "10windows" | grep -Po '(?<!10)windows'

[root@wangjingjing 0202]# echo "10windows" | grep -Po '10(?<!10)windows'

[root@wangjingjing 0202]# echo "98windows" | grep -Po '(?<!10)windows'

windows

[root@wangjingjing 0202]# echo "98windows" | grep -Po '98(?<!10)windows'

98windows

8,       A|B: 匹配A或者BAB都是正则表达式

[root@wangjingjing 0202]# egrep "^h|o$" file.txt

hello

hi

hello world

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值