shell之正则表达式

一 正则表达式

正则表达式:描述某些字符串匹配规则的工具

使用原因:程序设计过程中不可避免的遇到处理某些文本情况,有时候要查找符合某些比较复杂规则的字符串。正则表达式以非常简单的代码完成。

常见的支持正则表达式的UNIX工具:

grep命令族:用于匹配文本行

sed流编辑器:用于改变输入流

awk:用于处理字符串的语言

more或者less等:文件查看程序

ed,vi或者vim等:文本编辑器

实践正则表达式:

#! /bin/bash

str=`catversion.txt|grep rev`

echo"$str"

cat命令用来显示文本内容,竖线是管道,表示将cat命苦的输出结果作为后面的那个命令的输入,grep命令用来查找文本,rev指要匹配的字符串。上面执行结果表示version.txt文件中的某一行含义rev这个字符串,实际上,grep命令后面的参数可以换成任意的正则表达式)

1.1 正则表达式原理

正则表达式是对文本进行过滤的工具,之所以有过滤文本的功能,因为它定义了一系列的元字符,通过元字符配合其他字符来表达出一种规则。只有符合该规则的文本才能保留下来。

元字符:描述字符的字符。

元字符作用:对表达式的内容,转换以及各种操作信息进行描述。


 1.2  基本正则表达式

又称标准正则表达式,仅支持最基本的元字符集。

基本正则表达式定义的元字符主要有:

 1)行首定位符 “^”

用来匹配行首的字符。表示行首的字符是^后面的那个字符。

行首定位符位于所作用的字符之前

例如:

#列出/etc目录中的以字母po开头的文件名

str=`ls /etc |grep "^po"`

echo"$str"

^po理解为第一个字符为p,紧跟着一个字母o的文本行。不要理解为字符串po开头的文本行。)      

 2)行尾定位符”$”

作用:定位文本行的末尾。

行尾定位符位于所作用的字符之后。

#列出/etc目录中以conf结尾的文件名

str=`ls /etc |grep "conf$"`

echo"$str"

结果:anthy-conf

       asound.conf

 注意:

精确匹配一个文本行:^cat$ 完全匹配cat的文本行

^$:匹配所有空行

单独的^$没有任何意义,因为任何一个文本行都有开头和结尾。

 3)单个字符匹配”.”

圆点.用来匹配任意单个字符。包括空格,但不包括换行符\n。当使用”.”后,意味着该位置一定有一个字符,无论他是什么字符。

例:

#列出所有的包含字符串“samba”的文件名,不管samba后面有没有字符

str=`ls /etc |grep "samba"`

echo"$str"

echo"==============================="

#列出包含字符串samba,且samba后面只是含义一个字符

str=`ls /etc |grep "samba."`

echo"$str"

结果:samba

      samba4

======================

samba4

(可以连续使用..来匹配多个字符,如l..p,匹配含义字母l,然后是两个任意字符,再接着是字母p的字符串)       

 4) 限定符“*”

限定符本身不代表任何字符,用来指定其前面的一个字符必须重复出现多次才能满足匹配。而星号表示匹配其前导字符的任意次数,包括0

#筛选出以字符s开头,紧跟着1个字符s,再接着任意个字符s的文件名

str=`ls /etc |grep "^sss*"`

echo"$str" 

结果:ssh

        ssl

        sssd

 5) 字符集匹配“[]”

只要某个字符串在方括号所在的位置上出现了方括号中的任意一个字符,就满足匹配规则。

对于连续的数字或字母,可使用连字符-来表示一个范围。

如:[a-f]表示匹配af中的任意一个字母

[0-9]匹配任意单个数字

#筛选所有以字符r开头,并且紧跟着1个字符c的文本行

str=`ls /etc |grep "^rc"`

echo "$str"

echo "=============================="

#筛选所有以字符r开头,紧跟着1个字符为c,下面1个字符为单个数字的文本行

str=`ls /etc | grep "^rc[0-9]"`

echo "$str"

 6)字符集不匹配“[^]”

 1.3  扩展正则表达式

(egrep命令默认使用扩展正则表达式)

1 )限定符“+”

+”限定前面的字符至少出现一次。

#筛选以字符串“ss”开头,后面至少紧跟着1个字符“s”的文本行

str=`ls /etc |egrep "^sss+"`

echo"$str"

结果:sssd

 2)限定符“?”

限定前面的字符最多只出现一次。

#筛选以字符串“ss”开头,后面跟着0或者1s的文本行

str=`ls /etc |egrep "^sss?"`

echo"$str"

结果:ssh,ssl,sssd

 3)竖线“|”和圆括号“()”

竖线|表示多个正则表达式之前或的关系

圆括号表示一组可选值得集合。

竖线和圆括号经常一起使用,表示一组可选值。

#筛选含有字符串“ssh”、“ssl”或者以字符串“yum”开头的文本行

str=`ls /etc |egrep "(ssh|ssl|^yum)"`

echo"$str"

1.4 Perl正则表达式

1)数字匹配\d

2)非数字匹配\D

3)空白字符匹配\s

4)非空白字符匹配\S

1.5正则表达式应用

匹配单个字符

1 单个一般字符

英文字符,数字,空白字符以及标点符号

#搜索demo2.txt含有字符“a”的文本行

str=`grep"a" demo2.txt`

echo"$str"

 2 转义后的元字符

要匹配元字符本身,需要在这些字符的前面加上\,关闭这些元字符的特殊意义,保留其字面意义。

反斜线也是一个元字符,如果要匹配,也要加\,即表达式“\\”表示匹配一个反斜线。

 3 方括号表达式

当元字符位于方括号中时,除了连字符-或者^之外,其他元字符都会失去特殊意义。如:

[\.]表示的是反斜线\和圆点.这两个字符。如果要匹配圆点,[.]就可以了。

 

匹配多个字符

1 将多个字符按照指定顺序拼接起来

#搜索字符串“matter

str=`grep"matter" demo3.txt`

echo"$str"

2 方括号或星号等配合

#匹配任意多个字符“o

str=`grep"lo*king" demo3.txt`

echo"$str"

例子:筛选符合指定格式的电话号码

#筛选符合格式的电话号码

str=`egrep"800-[[:digit:]]{3}-[[:digit:]]{4}$" demo4.txt`

echo"$str"

 1.6 正则表达式优先级

\   转义符

[]  方括号表达式

()   分组

*,+?{m},{m,}{m,n}  限定符

普通字符  从左到右顺序

^,$ 定位符

|   或运算

(从高到低)

 

1.7 子表达式

由多个普通字符或者元字符组成的一个小的正则表达式。作为一个大的正则表达式的一部分使用,不能单独使用。使用圆括号括起来。

例子:匹配IP地址

#匹配IP地址

str=`egrep"^([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}$" ip.txt`

echo"$str"

(子表达式表示匹配1-3个数字,然后是一个圆点。整个表达式描述的字符串以3组重复的1-3个数字后跟一个圆点开头,然后以1-3个数字结尾)

精确匹配IP地址:

#匹配正确IP地址

str=`egrep"^([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"ip.txt`

echo"$str"

 1.8 通配符

shell本身不支持正则表达式,使用正则表达式的是shell命令和工具。

shell使用了正则表达式中的某些元字符作为通配符,常用的有*,?,[],{},^等。但意义有所不同。

如:*表示匹配任意的字符,在非正则表达式中限制其前导字符的0次或多次重复。

例:

列出以ex开头的当前目录中所有的文件:ls–l ex*

列出以字符de开头的文件:ls –l [de]*

1.9 grep命令

grep命令使用正则表达式来搜索文本,并且把匹配的文本打印出来

grep [options]pattern [file]

option表示选项,pattern表示匹配的模式。file表示一系列文件名。

常用选项:

-c  只打印匹配的文本行的函数,不显示文本内容。

-i   匹配时忽略字母大小写

-h  当搜索多个文件,不显示匹配文件名前缀。

-l   只列出含义匹配的文本行的文件的文件名,不显示其具体匹配的内容。

-n  列出所有匹配的文本行,并显示行号

-s   不显示关于不存在或无法读取文件的错误信息

-v   只显示不匹配的文本行。

-w  匹配整个单词

-x   匹配整个文本行

-r   递归搜索,不仅搜索当前目录,还有各级子目录

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shell在线正则表达式生成器是一种工具,用于帮助用户快速生成符合正则表达式语法规则的表达式。用户可以通过在网页上输入所需匹配的文本样本,并通过选择不同的选项配置正则表达式的规则。生成器会根据用户输入的数据和选项,实时生成匹配模式,并显示在网页上供用户使用和测试。 这个在线生成器的优势是,节省了用户手动编写正则表达式的时间和精力,尤其对于不熟悉正则表达式语法的用户来说,更易于使用。用户只需要了解自己要匹配的文本样本的特点,并根据需要选取合适的选项,即可得到一个准确的正则表达式。 在生成器的界面上,通常会提供一些高级选项,如忽略大小写、多行匹配等,方便用户根据具体的需求进行定制。此外,还会根据用户输入的样本,实时给出匹配的示例,帮助用户理解和验证表达式的效果。 Shell在线正则表达式生成器在很多场景下都有用武之地。例如,在数据处理或文本分析中,我们经常需要对大量文本进行筛选、提取或替换操作。正则表达式可以提供强大的模式匹配能力,可以快速高效地处理各种文本情况。通过使用这个在线生成器,用户可以更加方便地生成所需的正则表达式,提高工作效率和准确性。 总而言之,Shell在线正则表达式生成器是一个便捷的工具,它可以帮助用户快速生成符合正则表达式语法规则的表达式,并提供实时的匹配示例。在数据处理和文本分析中使用它,可以节省时间、提高效率,并帮助用户更好地理解和应用正则表达式

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值