shell 正则表达式详解

这篇具有很好参考价值的文章主要介绍了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命令会从一个或者多个文件中搜索满足指定模式的文本行,并且打印出来。模式后面的所有的字符串参数都被看作是文件名。

shell 正则,正则表达式

示例:

1,  -n :    显示行号

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

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

shell 正则,正则表达式

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

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

num

shell 正则,正则表达式

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

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


shell 正则,正则表达式

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

shell 正则,正则表达式

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

shell 正则,正则表达式

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

shell 正则,正则表达式

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

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

shell 正则,正则表达式

--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

shell 正则,正则表达式

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

shell 正则,正则表达式

10,   -w:匹配单词

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

hello

hello world

shell 正则,正则表达式

四,基本正则表达式

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

shell 正则,正则表达式

基本正则表达式示例:

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

匹配以123为开头的

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

123 456 789

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

[root@wangjingjing ~]#

shell 正则,正则表达式

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

匹配以789结尾的

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

123 456 789

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

[root@wangjingjing ~]#

shell 正则,正则表达式

 

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

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

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

abcdabef

shell 正则,正则表达式

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

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

abcdabcdabcd

shell 正则,正则表达式

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

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

多次a

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

Aaabbbccc

0次a

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

bbbccc

shell 正则,正则表达式

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

shell 正则,正则表达式

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

匹配,abc的补集

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

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

m

shell 正则,正则表达式

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

取消.的特殊意义

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

3a14

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

[root@wangjingjing ~]#

shell 正则,正则表达式

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

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

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

aaaaaaaa

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

aaaaaaaa

shell 正则,正则表达式

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

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

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

aaaaaaaa

shell 正则,正则表达式

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

贪婪的,重复最多次

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

aaaaa

shell 正则,正则表达式

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

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

aaaaa

shell 正则,正则表达式

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

匹配abcd

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

abcdefbcdcdd

shell 正则,正则表达式

匹配abcdef,组1

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

abcdefbcdcdd

shell 正则,正则表达式

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

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

abcdefbcdcdd

shell 正则,正则表达式

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

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

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

hello

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

helloo

shell 正则,正则表达式

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

a*: 0-任意多

a?:0-1

a+:1-任意

a{n,m}: n-m

正则表达式字符集

shell 正则,正则表达式

正则表达式字符集示例:

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

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

shell 正则,正则表达式

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

hello123

shell 正则,正则表达式

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

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

hello123

shell 正则,正则表达式

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

hello123

shell 正则,正则表达式

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

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

hello123

shell 正则,正则表达式

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

hello123

shell 正则,正则表达式

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

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

Hello123

shell 正则,正则表达式

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

Hello123

shell 正则,正则表达式

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

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

Hello123

shell 正则,正则表达式

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

Hello123

shell 正则,正则表达式

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

空格

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

Hello    123

shell 正则,正则表达式

制表符(占8位)

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

Hello                        123

shell 正则,正则表达式

换行符(grep   -z 选线)

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

Hello

123

shell 正则,正则表达式

五,扩展正则表达式

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

shell 正则,正则表达式

扩展正则表达式示例:

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

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

sssssss

shell 正则,正则表达式

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

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

sssssss

shell 正则,正则表达式

3,    匹配单独的a

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

sssssss

shell 正则,正则表达式

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

a*?

a+?

a??

a{n,m}?

扩展:

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

加了?:的不参与分组

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

shell 正则,正则表达式

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

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

abcdefgcd

shell 正则,正则表达式

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

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

abcdefgbcd

shell 正则,正则表达式

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

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

abcdefgbcd

shell 正则,正则表达式

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]#

shell 正则,正则表达式

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

shell 正则,正则表达式

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]#

shell 正则,正则表达式

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

shell 正则,正则表达式

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

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

hello

hi

hello world

shell 正则,正则表达式文章来源地址https://www.toymoban.com/news/detail-795804.html

到了这里,关于shell 正则表达式详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Shell编程基础(十三)正则表达式

    格式:^ 表达式 $ 在不同的场景下,定义是一样,但使用要按照具体的命令去调用,中间的表达式都是通用的 普通元字符 所谓元数据,就是描述数据的数据,在这里就是描述正则的数据 ^ 表示正则从字符串 整行 起始位置匹配 ^abc 匹配 以abc开始的字符串 $ 表示正则一直匹配到

    2024年02月14日
    浏览(11)
  • Shell通配符和正则表达式

    Shell通配符和正则表达式

    目录 ​​​​​​​grep 通配符 正则表达式 grep家族有三大成员分别为:         grep:支持使用基本正则表达式。         egrep:支持使用扩展正则表达式。         fgrep:不支持使用正则表达式,即所有的正则表达式中的元字符都将作为一般字符,仅仅 拥有其字

    2024年02月16日
    浏览(11)
  • Shell脚本攻略:通配符、正则表达式

    Shell脚本攻略:通配符、正则表达式

    目录 一、理论 1.通配符 2.正则表达式 二、实验 1.通配符 2.正则表达式 (1)概念 通配符只用于匹配文件名、目录名等,不能用于匹配文件内容,而且是已存在的文件或者目录。 各个版本的shell都有通配符,这些通配符是一些特殊的字符, 用户可以在命令行的参数中使用这些

    2024年02月07日
    浏览(7)
  • Linux:shell脚本 正则表达式与AWK

    Linux:shell脚本 正则表达式与AWK

    目录   一、正则表达式 1.2元字符  1.3表示次数 1.4位置锚定 1.5分组或其他 1.6扩展正则表达式 1.7grep 二、AWK awk -F ​编辑三、sed 1.sed简介 2.sed工作流程 3.sed命令格式 3.1打印全部内容  3.2 查看文件,打印全部内容  3.3打印指定行内容 3.4支持正则表达式,打印范围内容  3.5#,/关

    2024年02月12日
    浏览(14)
  • Shell 正则表达式及综合案例及文本处理工具

    Shell 正则表达式及综合案例及文本处理工具

     目录 一、常规匹配 二、常用特殊字符 三、匹配手机号 四、案例之归档文件 五、案例之定时归档文件 六、Shell文本处理工具 1. cut工具 2. awk工具 一串不包含特殊字符的正则表达式匹配它自己 例子,比如说想要查看密码包含root字符串的,可以这样写 cat /etc/passwd | grep root 特

    2024年01月17日
    浏览(62)
  • shell之正则表达式及三剑客grep命令

    shell之正则表达式及三剑客grep命令

    什么是正则表达式? 正则表达式是一种描述字符串匹配规则的重要工具 1、正则表达式定义: 正则表达式,又称正规表达式、常规表达式 使用字符串描述、匹配一系列符合某个规则的字符串 普通字符: 大小写字母、数字、标点符号及一些其它符号 元字符: 在正则表达式中具

    2024年02月12日
    浏览(45)
  • Linux:shell脚本:基础使用(6)《正则表达式-awk工具》

    Linux:shell脚本:基础使用(6)《正则表达式-awk工具》

    awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 1)awk命令会逐行读取文件的内容进行处理 2)awk以’:’为分隔符,将第1行数据格式化为7段,每段数

    2024年02月12日
    浏览(13)
  • Linux:shell脚本:基础使用(4)《正则表达式-grep工具》

    Linux:shell脚本:基础使用(4)《正则表达式-grep工具》

    正则表达式定义:         使用单个字符串来描述,匹配一系列符合某个句法规则的字符串 正则表达式的组成:         普通字符串: 大小写字母,数字,标点符号及一些其他符号         元字符:在正则表达式中具有特殊意义的专用字符 正则表达式不能单独使用,需要配

    2024年02月12日
    浏览(9)
  • linux中shell脚本——shell数组、正则表达式及文件三剑客之AWK

    linux中shell脚本——shell数组、正则表达式及文件三剑客之AWK

    目录 一.shell数组 1.1.数组分类 1.2.定义数组方法 二.正则表达式 2.1.元字符 2.2.表示次数 2.3.位置锚定 2.4.分组 2.5.扩展正则表达式 三.文本三剑客之AWK 3.1.awk介绍及使用格式 3.2.处理动作 3.3.awk选项 3.4.awk处理模式 2.5.awk常见的内置变量  2.6.if条件判断 1.1.数组分类 ①关联数组:必

    2024年02月12日
    浏览(49)
  • 【Linux命令行与Shell脚本编程】第十九章 正则表达式

    【Linux命令行与Shell脚本编程】第十九章 正则表达式

    正则表达式基础 定义BRE模式 扩展正则表达式 在sed和gawk中创建正则表达式,以得到所需的数据。 正则表达式是一种可供Linux工具过滤文本的自定义模板,使用元字符来描述数据流中的一个或多个字符. Linux工具(比如sed或gawk)会在读取数据时使用正则表达式对数据进行模式匹配

    2024年02月13日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包