“Shell“正则表达式;文本三剑客Sed

一.正则表达式

1.1正则表达式介绍

通常用于判断语句中,用来检查某一字符串是否满足某一格式

  • 正则表达式是由普通字符与元字符组成
  • 普通字符包括大小写字母、数字、标点符号及子些其他符号
  • 元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符的面的字符或表达式)在目标对象中的出现模式

基础正则表达式常见元字符: (支持的工具: grep、egrep、sed、awk)
在这里插入图片描述
拓展正则表达式元字符(支持的工具:egrep,awk)grep -E sed -E
在这里插入图片描述

1.2命令演示

在这里插入图片描述
1、查找符合条件的以g开头和d结尾的都能匹配到在这里插入图片描述
2.使用封死只能匹配到规定的内容
在这里插入图片描述
3、^是匹配以什么开头
在这里插入图片描述

1.3正则表达式实验演示

1.号码分配:
区号025开头,号码与区号间可以是空格、-、没有,号码必须是5或者8开头的八位数

02588888888
025-5555555555
025 12345678
025 54321678
025ABC88888
025-85432109
028-85643210
0251-52765421

grep -E '^(025)[ -]?[58][0-9]{7}$' num.txt
grep -P '^(025)[ -]?[58]\d{7}$' num.txt     #\d表示数字 需要加上-P支持
 
区号025开头  ^(025)
号码与区号间可以是空格、-、没有   [ -]?
号码必须是5或者8开头的八位数 [58][0-9]{
    
    7}
(025)[ -]?[58][0-9]{
    
    7}
电子邮箱
用户名@子域名.[二级域名].顶级域

2、电子邮箱的查找分配:
电子邮箱内容
[email protected]
li [email protected]
wang@[email protected]
zhao [email protected]
[email protected]

用户名@:长度要求在6-18位,任意大小写英文,任意数字,除了@符号和空格以外的其它任意符号字符,开头只能是 _ 或者字母
([a-zA-Z_][@ ]{5,17})@
子域名.[二级域名]:长度任意,符号只能包含 - _ .
[a-zA-Z0-9_-.]+(.[a-zA-Z0-9_-.]+)?
.顶级域名: 长度在2-5,任意大小写英文
.([a-zA-Z]{2,5})$

egrep "^([a-zA-Z_][^@ ]{5,17})@[a-zA-Z0-9\_\-\.]+(\.[a-zA-Z0-9\_\-\.]+)?\.([a-zA-Z]{2,5})$"

二.Sed编辑器

2.1Sed介绍

sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命今来处理数据流中的数据,这些命今要么从命令行中输入,要么存储在一个命令文本文件中。
sed 的工作流程主要包括读取、执行和显示三个过程:

  • 读取 : sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区(又称模式空间,pattern space)。
  • 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed命令 将会在所有的行上依次执行。
  • 显示 : 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都

被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

命令格式:
sed  -e  '操作'   文件1   文件2  ...
sed  -n   -e   '操作'   文件1   文件2  ...
sed  -f  脚本文件   文件1   文件2  ...
sed  -i   -e   '操作'   文件1   文件2  ...


sed  -e   `n{
    
    
操作1
操作2
...
}` 文件1    文件2   ...

常用选项:

选项 功能
-e 或 --expression= 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f 或 --file= 表示用指定的脚本文件来处理输入的文本文件
-h或–help 显示帮助
-n,–quiet 或 silent 禁止sed编辑器输出,但可以与p命令一起使用完成输出。
-i 直接修改目标文本文件

常用操作:

操作 解释
s 替换,普换指定字符
d 删除,删除选定的行
a 增加,在当前行下面增加一行指定内容
i 插入,在选定行上面插入一行指定内容
c 替换,将选定行替换为指定内容
y 字符转换,转换前后的字符长度必须相同
p 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容:如果有非打印字符,则以 ASCIl码输出。其通常与“-n”选项一起使用
= 打印行号
l(小写)L 打印数据流中的文本和不可打印的ASCLL字符(比如结束符$,制表符\t)

2.2操作命令演示

打印文件:
在这里插入图片描述
在这里插入图片描述
打印文件行数
在这里插入图片描述
做打印文件后加上$
在这里插入图片描述
打印文件按序号排序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
打印指定行
在这里插入图片描述
显示连续几行
在这里插入图片描述
显示几行到最后一行:
在这里插入图片描述
显示指定行和最后一行
在这里插入图片描述
打印所指定行之后的连续3行:

在这里插入图片描述
输出到第五行退出命令:(只能从开头开始)
在这里插入图片描述

2.3替换

命令格式:

行范围 s/旧字符串/新字符串/替换标记

替换标记:

标记 解释
数字 表明新字符串将替换第几处匹配的地方
g 表明新字符串将替换第几处匹配的地方
p 表明新字符串将替换第几处匹配的地方
w文件 将替换的结果写到文件中

替换命令使用:
在这里插入图片描述
1、在开头插入#号
在这里插入图片描述
2、删除所有行的#
在这里插入图片描述
3、使用s来替换

 sed -n  '/swap/ s/^/#/gp' /etc/fstab     //注释掉文件里有swap的行内容 
#UUID=31b870c6-db09-424d-bfdd-20d7bbb54337 swap                    swap    defaults        0 0

sed -n  '/^UUID/ s/^/#/gp' /etc/fstab   //注释掉所有以UUID开头的行内容
#UUID=5429c72d-e20c-4b24-bddc-2446d40ec8ba /                       xfs     defaults        0 0
#UUID=0bc8a633-df1e-404d-a44c-2cdd57be56cb /boot                   xfs     defaults        0 0
#UUID=31b870c6-db09-424d-bfdd-20d7bbb54337 swap                    swap    defaults        0 0
sed  's/.*swap.*/#&/' /etc/fstab        //&这个命令表示匹配前面执行命令的整行内容

# /etc/fstab
# Created by anaconda on Wed Mar 22 19:07:19 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=5429c72d-e20c-4b24-bddc-2446d40ec8ba /                       xfs     defaults        0 0
UUID=0bc8a633-df1e-404d-a44c-2cdd57be56cb /boot                   xfs     defaults        0 0
#UUID=31b870c6-db09-424d-bfdd-20d7bbb54337 swap                    swap    defaults        0 0

4、使用-f 加上脚本来执行命令

 vim dz  //写入脚本文件
#把以root开头的行注释
/^root/ s/^/#/     //把ftp替换成mysed
s/ftp/mysed/g     //把以nologin为结尾的行删除
/nologin$/ d

5、在s替换后面加的字符可以是任何字符

sed -n 's/\/bin\/bash/\/bin\/csh/p' /etc/passwd
sed -n 's!/bin/bash!/bin/csh!p' /etc/passwd		//使用“!”作为字符串分隔符
sed -i 's9\945\9\99\98\939g' test.txt		//将94599替换为9893

2.4插入

1.c命令插入
在这里插入图片描述
2、使所有的1字符转换成A,所有的4字符转换成B,所有的5字符转换成C
在这里插入图片描述
3、使用a在指定的行下面插入内容
在这里插入图片描述
4、使用i在指定的行上面插入内容
在这里插入图片描述
5、将1到3行的内容剪切到末尾,H表示复制到剪切板,G表示粘贴到指定行后
在这里插入图片描述
6.替换字符位置
在这里插入图片描述

2.4总结:

sed   -n   -e   '行号区间p'
                '/字符串或正则/p'
#删除
                 '行号区间d'
                 '/字符串或正则/d'
                 '行号区间 s/old/new/g'
                 '/字符串或正则/ s/old/new/g'
                 '行号区间c XXX'
                 '/字符串或正则/cXXX'
                 '行号区间 y/old/new/'
                 '/字符串或正则/ y/old/new/'
                 '/字符串或正则/ y/old/new/'
#插入
                 '行号区间 a  XXX'
                 '行号区间 i  XXX'
                 '行号区间 r  文件'
                 

猜你喜欢

转载自blog.csdn.net/Wanghwei17/article/details/130641218