Sed与正则表达式

sed

sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。

sed是操作、过滤和转换文本内容的强大工具

常用功能包括结合正则表达式对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤(过滤指定字符串)、取行(取出指定行)。

 

语法:

sed      [选项]       [sed内置命令字符]     [输入文件]

选项:

参数选项解释
-n取消默认sed的输出,常与sed内置命令p一起用(p代表打印)
-i直接将修改结果写入文件,不用-i,sed修改的是内存数据
-e多次编辑,不需要管道符了
-r支持正则扩展

sed的内置命令符用于对文件进行不同的操作功能,如对文件增删改查

sed常用内置命令字符:

sed的内置命令字符解释
aappend,对文本追加,在指定行后面添加一行/多行文本
dDelete,删除匹配行
iInsert,表示插入文本,在指定行前添加一行/多行文本
pPrint,打印匹配行的内容,通常p与-n一起用
s/正则/替换内容/g匹配正则内容,然后替换内容(支持正则),结尾g代表全局匹配

sed匹配范围

范围解释
空地址全文处理
单地址指定文件某一行
/pattern/被模式匹配的每一行
范围区间10,20 十到二十行,10,+5 第10行向下5行, /pattern1/,/pattern2/
步长1~2,表示1,3,5,7,9行,奇数行;2~2,表示2,4,6,8,10行,偶数行

案例

1.打印输出第二,三行

[root@timy-test-k8s01 ~]# cat test.txt 
1.  My name is timy
2.  I learn Linux
3.  I like fatniess
4.  My qq is 12345678
5.  I love zhuer

[root@timy-test-k8s01 ~]# sed "2,3p" -n test.txt     
#打印输出第2,3行,p代表打印。如果不加-n会默认全部行打印输出
2.  I learn Linux
3.  I like fatniess

[root@timy-test-k8s01 ~]# sed "2,3p"  test.txt    #不加-n会默认全部打印显示
1.  My name is timy
2.  I learn Linux
2.  I learn Linux
3.  I like fatniess
3.  I like fatniess
4.  My qq is 12345678
5.  I love zhuer

2.过滤出含有Linux的字符串

[root@timy-test-k8s01 ~]# sed -n '/Linux/p' test.txt 
2.  I learn Linux

3.删除第3行到结尾

[root@timy-test-k8s01 ~]# sed '3,$d' test.txt  
 #只删除输出数据的第3行到第5行,不修改文件数据
1.  My name is timy
2.  I learn Linux
[root@timy-test-k8s01 ~]# cat test.txt 
1.  My name is timy
2.  I learn Linux
3.  I like fatniess
4.  My qq is 12345678
5.  I love zhuer

4.将所有的My替换成I

[root@timy-test-k8s01 ~]# sed "s/My/I/g" test.txt  #不用-i,只是修改的内存数据
1.  I name is timy
2.  I learn Linux
3.  I like fatniess
4.  I qq is 12345678
5.  I love zhuer

[root@timy-test-k8s01 ~]# cat test.txt 
1.  My name is timy
2.  I learn Linux
3.  I like fatniess
4.  My qq is 12345678
5.  I love zhuer

[root@timy-test-k8s01 ~]# sed "s/My/I/g" test.txt -i  
#使用-i,直接将修改的结果写入文件。
[root@timy-test-k8s01 ~]# cat test.txt 
1.  I name is timy
2.  I learn Linux
3.  I like fatniess
4.  I qq is 12345678
5.  I love zhuer

[root@timy-test-k8s01 ~]# 

5.将所有I换成My,并将qq号改成87654321

[root@timy-test-k8s01 ~]# cat test.txt 
1.  I name is timy
2.  I learn Linux
3.  I like fatniess
4.  I qq is 12345678
5.  I love zhuer

[root@timy-test-k8s01 ~]# sed -e "s/I/My/g" -e "s/12345678/87654321/g" test.txt -i
#-e参数可以进行多次编辑
[root@timy-test-k8s01 ~]# cat test.txt 
1.  My name is timy
2.  My learn Linux
3.  My like fatniess
4.  My qq is 87654321
5.  My love zhuer

6.在第二行后追加内容

[root@timy-test-k8s01 ~]# sed "2a My Linux is good" test.txt -i
#a代表在指定行后面追加一行内容
[root@timy-test-k8s01 ~]# cat test.txt 
1.  My name is timy
2.  My learn Linux
My Linux is good
3.  My like fatniess
4.  My qq is 87654321
5.  My love zhuer

7.在第3行后追加两行内容,使用换行符

[root@timy-test-k8s01 ~]# sed "3a I like girl \n I like pretty girl" test.txt -i
[root@timy-test-k8s01 ~]# cat test.txt 
1.  My name is timy
2.  My learn Linux
My Linux is good
I like girl 
 I like pretty girl
3.  My like fatniess
4.  My qq is 87654321
5.  My love zhuer

8.在每行后面添加分隔符号

[root@timy-test-k8s01 ~]# sed "a -------------" test.txt -i
[root@timy-test-k8s01 ~]# cat test.txt 
1.  My name is timy
-------------
2.  My learn Linux
-------------
My Linux is good
-------------
I like girl 
-------------
 I like pretty girl
-------------
3.  My like fatniess
-------------
4.  My qq is 87654321
-------------
5.  My love zhuer
-------------

sed配合正则表达式企业案例

取出Linux的IP地址

1.删除网卡信息

[root@timy-test-k8s01 ~]# ifconfig
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.16.66.88  netmask 255.255.255.0  broadcast 10.16.66.255
        inet6 fe80::2834:95d6:baaa:9918  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d1:81:3e  txqueuelen 1000  (Ethernet)
        RX packets 11880027  bytes 775641366 (739.7 MiB)
        RX errors 0  dropped 305  overruns 0  frame 0
        TX packets 76973  bytes 6320158 (6.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 32  bytes 2592 (2.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 32  bytes 2592 (2.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2.去头去尾法

交给管道符,一次去头,一次去尾

[root@timy-test-k8s01 ~]# ifconfig ens192    #只显示ens192网卡信息
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.16.66.88  netmask 255.255.255.0  broadcast 10.16.66.255
        inet6 fe80::2834:95d6:baaa:9918  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d1:81:3e  txqueuelen 1000  (Ethernet)
        RX packets 11880510  bytes 775671449 (739.7 MiB)
        RX errors 0  dropped 305  overruns 0  frame 0
        TX packets 76997  bytes 6323422 (6.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@timy-test-k8s01 ~]# ifconfig ens192 | sed "2p" -n    #只显示第二行
        inet 10.16.66.88  netmask 255.255.255.0  broadcast 10.16.66.255
[root@timy-test-k8s01 ~]# ifconfig ens192 | sed "2p" -n | sed "s/^.*inet//"
#去头,删除IP地址前面的空格和inet
 10.16.66.88  netmask 255.255.255.0  broadcast 10.16.66.255
[root@timy-test-k8s01 ~]# ifconfig ens192 | sed "2p" -n | sed "s/^.*inet//" | sed "s/net.*$//" 
#去尾,删除netmask后面所有字符
 10.16.66.88  

3.使用-e多次编辑法

[root@timy-test-k8s01 ~]# ifconfig ens192 | sed "2s/^.*inet//p" -n
#删除IP地址前的空格和inet,并打印显示出来
 10.16.66.88  netmask 255.255.255.0  broadcast 10.16.66.255

[root@timy-test-k8s01 ~]# ifconfig ens192 | sed -e "2s/^.*inet//" -n -e "2s/net.*$//p"
 10.16.66.88  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值