(五)、Shell正则表达式


正则表达式概述

(1)、正则表达式(regular expression)是一种字符模式,用于在查找过程中匹配指定的字符

(2)、在shell编程中,正则表达式被置于两个正斜杠之间。如:“/root/”就是一个正则表达式,它将匹配被查找的内容中任何位置出现root的部分

注:正则表达式最强大之处是对字符串的处理

正则表达式元字符

(1)、正则表达式元字符则由各种执行模式匹配操作的程序来解析

(2)、如:vi/vim、grep、sed、awk等程序。在这些程序中,可以通过正则表达式以某种方式界定模式,从而控制进行哪些操作

(3)、正则表达式元字符:

  • +:匹配前面的子表达式一次或多次。例如,'zo+'能匹配“zo”以及“zoo”,但不能匹配“z”(以z开头,o出现一次或多次)

  • ?:匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”

元字符功能示例匹配对象
^行首定位符/^love/匹配所有以love开头的行
$行尾定位符/love$/匹配所有以love结尾的行
.匹配单个字符/l…e/匹配包含一个l,后跟两个字符,再跟一个e的行
*匹配0或多个重复的位于星号前的字符/*love/匹配包含跟在0个或多个空格后的包含love的行
[]匹配一组字符中任一个/[Ll]ove/匹配包含love或Love的行
[x-y]匹配指定范围内的一个字符/[A-Z]ove/匹配后面跟着ove的一个A至Z之间的字符
[^]匹配不在指定组内的字符/[^A-Z]/匹配不在范围A至Z之间的任意一个字符
\用来转义元字符/love\./匹配包含love,后面跟一个句号。(未经转义的)句点通常匹配单个任意字符
\<词首定位符/\<love/匹配包含以love开头的词的行(vi和grep支持)
\>词尾定位符/love\>/匹配包含以love结尾的词的行(vi和grep支持)
\(…\)匹配稍后将要使用的字符的标签/\(love\) able\ler/最多可以使用9个标签,模式中最左边的标签是第一个。例如,模式love被保存为标签1,用\1表示。左边这个例子中,查找串是一个lovable后跟lover的长串(sed、vi、grep支持)
x\{m\}或x\{m,\}或x\{m,n\}字符x的重复出现:m次、至少m次、至少m次且不超过n次o\{5,10\}匹配包含5~10个连续的字母o的行(vi、grep支持)
# 查询文件内容,输入/加查找条件,再输入/按回车即可
bc
ieddd
123deewf
90908kjknwejnf
iii
bcbc
~                                                                              
~                                                                                                                                                         
~                                                                              
~                                                                              
/[^Aa]b/

grep概述

(1)、grep命令在文件中查找指定的正则表达式,并且打印所有包含该该正则表达式的行

(2)、grep命令在文件中查找某个字符模式,如果这个模式中包含空格,就必须用引号把它括起来。位于模式之后的所有单词被当做文件名

(3)、命令格式:grep 要查找的模式 文件名,比如在/etc/passwd文件中,查找包含root的行,命令为:grep root /etc/passwd

在这里插入图片描述

grep支持的正则表达式元字符

grep命令命令执行的操作
grep ‘\<Tom\>’ file打印包含词Tom的行
grep ‘Tom Savage’ file打印包含Tom Savage的行
grep ‘^Tommy’ file打印以Tommy开头的行
grep ‘\.bak$’ file打印以.bak结尾的行。单引号保护了美元符号($),使之不被shell解释
grep ‘[Pp]yramid’ *打印当前工作目录下所有文件中包含pyramid或Pyramid的行
grep ‘[A-Z]’ file打印所有至少包含一个大写字母的行
grep ‘[0-9]’ file打印所有至少包含一个数字的行
grep ‘[A-Z]…[0-9]’ file打印包含这样一个模式的行,该模式以大写字母开头、数字结尾、共有五个字符
grep -w ‘[tT]est’ file打印包含词Test或test的行
grep -s ‘Tom Savage’ file打印包含Tom Savage的行,但不打印找到的行。可以用于检查grep的退出状态
grep -v ‘Mary’ file打印所有不含Mary的行
grep -i ‘sam’ file打印所有包含sam的行,sam的各种大小写形式都可以(如:SAM、sam、Sam、sAm)

在这里插入图片描述

man grep:查看grep的使用方法;-c打印行数

grep退出状态

(1)、grep执行后返回一个退出状态,以说明能否定位到要查找的模式

(2)、如果找到了就返回退出状态0表示成功

(3)、如果没有找到就返回1作为退出状态

(4)、当找不到要搜索的文件时,返回2

sed概述

(1)、sed是一个文件处理工具,以行为单位进行处理,可以将数据进行替换、删除、新增、选取等特定工作

(2)、sed命令行格式为:sed [-选项] ‘command’ 输入文本

sed原理

(1)、sed逐行处理文件或输入,并将输出结果发送到屏幕

(2)、例1:打印文件/etc/passwd中所有包含root的行

sed -n '/root/p' /etc/passwd

在这里插入图片描述

sed退出状态

sed不管是否找到指定模式,它的退出状态都是0,只有当命令存在语法错误时,sed的退出状态才不是0

sed定址功能

(1)、定址用于决定对那些行进行编辑,地址的形式可以是数字、正则表达式、或是二者的结合,如果没有指定地址,sed将处理输入文件中的所有行

(2)、例:删除文件file中的第1至3行

sed '1,3d' file

sed修改文件

如需要使用sed修改文件,可以使用以下方法:

  • 把sed处理后的结果重定向到另外一个文件。如:sed ‘1,3d’ file>new_file

  • 使用-i参数直接修改文件。如:sed -i ‘1,3d’ file

sed替换文件

(1)、sed替换文件内容,格式为:sed ‘s/string/new_string/’ filename

(2)、例1:将filename文件中,root替换为adb

sed 's/root/abc/' filename

(3)、例2:将root替换为abc,并修改文件

sed -i 's/root/abc/' filename

sed示例

命令功能
sed -n ‘/sentimental/p’ filex把文件filex中所有包含sentimental的行打印在屏幕上;filex的内容不会被改变;如果没有-n选项,所有包含sentimental的行都会被打印两次
sed ‘1,3d’ filex>newfilex删除文件filex的前3行,将修改结构保存到newfilex文件中
sed ‘/[Dd]anied/d’ filex删除包含Daniel或daniel的行
sed -n ‘15,20p’ filex只打印第15~20行
sed ‘1,10s/Montana/MT/g’ filex将第1~10行所有的Montana全局替换为MT
sed ‘/March/\!d’ filex(csh)删除所有不含March的行
sed ‘/March/!d’ filex(sh)删除所有不含March的行。(只有在csh中才要用分斜杠来转义历史字符)
sed ‘/report/s/5/8’ filex把所有包含report的行里出现的第一个5改为8
sed ‘/[Dd]anied/d’ filex删除包含Daniel或daniel的行

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹿快跑~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值