【Linux正则表达式之sed】

🍺sed

Linux三剑客sed:

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

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

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

在这里插入图片描述

在这里插入图片描述

sed语法:

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

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

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

sed常用的内置命令字符:
sed的内置命令字符解释
aappend,对文本追加,在指定行后面添加一行/多行文本
dDelete,删除匹配行
iinsert,表示插入文本,在指定行前添加一行/多行文本
pPrint,打印匹配行的内容,通常p与-n一起用
s/正则/替代内容/g匹配正则内容,然后替换内容(支持正则),结尾**g(Global)**代表全局匹配
sed匹配范围
范围解释
空地址(空格)全文处理
单地址指定文件某一行
/pattern被匹配到的每一行
范围区间10,20 十到二十行,10,+5第10行向下5行, /pattern1/,/pattern2/
步长1~2,表示1、3、5、7、9行,2~2两个步长,表示2、4、6、8、10,偶数行
sed案例

准备测试文件

cat > luffycity.txt <<-EOF
My name is chaoge.
I teach Linux.
I like play computer game.
My qq is 12345678.
My website is http://pythonav.cn.
EOF
  • 1、输出文件第2、3行的内容
# sed -n:取消默认输出,sed默认会将匹配规则的和不匹配规则的文本输出,因此需要使用-n参数取消默认输出
[root@kvm01 ~]# sed -n '2,3p' luffycity.txt 
I teach Linux.
I like play computer game.

# 显示前两行并向下输出三行
[root@kvm01 ~]# sed -n "2,+3p" luffycity.txt 
I teach Linux.
I like play computer game.
My qq is 12345678.
My website is http://pythonav.cn.
  • 2、过滤出含有Linux的字符串行
# sed /Linux/p: "/p"字符表示打印需要查找的字符
[root@kvm01 ~]# sed -n "/Linux/p" luffycity.txt 
I teach Linux.
  • 3、删除含有game的行然后输出
# 这里只是删除了包含"game"字段的行输出到屏幕,并没有修改文件的内容
[root@kvm01 ~]# sed "/game/d" luffycity.txt
My name is chaoge.
I teach Linux.
My qq is 12345678.
My website is http://pythonav.cn.

[root@kvm01 ~]# cat luffycity.txt 
My name is chaoge.
I teach Linux.
I like play computer game.
My qq is 12345678.
My website is http://pythonav.cn.

# 添加上-i参数,修改luffycity.txt文件,删除里面带game的行
[root@kvm01 ~]# sed -i "/game/d" luffycity.txt && cat luffycity.txt 
My name is chaoge.
I teach Linux.
My qq is 12345678.
My website is http://pythonav.cn.

删除第五行到结尾:

[root@kvm01 ~]# cat -n luffycity.txt 
     1  My name is chaoge.
     2  I teach Linux.
     3  My qq is 12345678.
     4  My website is http://pythonav.cn.
     5  My website is http://pythonav.cn.
     6  My website is http://pythonav.cn.
     7  My website is http://pythonav.cn.
     8  My website is http://pythonav.cn.
     9  My website is http://pythonav.cn.
    10  My website is http://pythonav.cn.
    
[root@kvm01 ~]# sed -i '5,$d' luffycity.txt       

[root@kvm01 ~]# cat -n luffycity.txt           
     1  My name is chaoge.
     2  I teach Linux.
     3  My qq is 12345678.
     4  My website is http://pythonav.cn.
  • 4、将luffycity.txt文档中的My替换成His
# 命令语法: 双引号或者单引号作为字符串内容都可以
$ sed "s/你想查找的内容/你想替换成的内容/g"
$ sed "s#你想查找的内容#你想替换成的内容#g"
$ sed "s@你想查找的内容@你想替换成的内容@g"

[root@kvm01 ~]# sed -i 's/My/His/g' luffycity.txt 
[root@kvm01 ~]# cat -n luffycity.txt 
     1  His name is chaoge.
     2  I teach Linux.
     3  His qq is 12345678.
     4  His website is http://pythonav.cn.
  • 5、替换所有的My为His,同时换掉QQ号为88888888
# 替换成原来的文件
[root@kvm01 ~]# sed -i 's/His/My/g' luffycity.txt | cat -n luffycity.txt 
     1  My name is chaoge.
     2  I teach Linux.
     3  My qq is 12345678.
     4  My website is http://pythonav.cn.
     
# sed -e:多次替换编辑文件,将'My'替换成'His','12345678'替换成'88888888'输出到屏幕
[root@kvm01 ~]# sed -e 's/My/His/g' -e 's/12345678/88888888/g' luffycity.txt
His name is chaoge.
I teach Linux.
His qq is 88888888.
His website is http://pythonav.cn.

# sed -e -i:多次替换编辑文件并修改其中的内容
[root@kvm01 ~]# sed -e 's/My/His/g' -e 's/12345678/88888888/g' -i luffycity.txt && cat luffycity.txt
His name is chaoge.
I teach Linux.
His qq is 88888888.
His website is http://pythonav.cn.
  • 6、在文件第二行追加内容a字符功能,写入到文件,还需要添加-i
# 将"My linux is good",输出到luffycity.txt这个文件的第三行输出到屏幕(不加-i参数默认不修改文件内容)
# 字符a表示在第二行后面添加
[root@kvm01 ~]# sed "2a My linux is good." luffycity.txt 
His name is chaoge.
I teach Linux.
My linux is good.
His qq is 88888888.
His website is http://pythonav.cn.

# -i: 将"My linux is good",输出到luffycity.txt这个文件的第三行(此处修改luffycity.txt这份文件)
[root@kvm01 ~]# sed -i "2a My linux is good." luffycity.txt && cat luffycity.txt 
His name is chaoge.
I teach Linux.
My linux is good.
His qq is 88888888.
His website is http://pythonav.cn.
# 在第四行前面添加一行内容
[root@kvm01 ~]# sed "4i My telphone is 00000000" luffycity.txt 
His name is chaoge.
I teach Linux.
My linux is good.
My telphone is 00000000
His qq is 88888888.
His website is http://pythonav.cn.

# -i: 将"My telphone is 00000000",输出到luffycity.txt这个文件的第四行前添加(此处修改luffycity.txt这份文件)
[root@kvm01 ~]# sed -i "4i My telphone is 00000000" luffycity.txt && cat luffycity.txt 
His name is chaoge.
I teach Linux.
My linux is good.
My telphone is 00000000
His qq is 88888888.
His website is http://pythonav.cn.

# 通过使用\n转义符,将两句话分别换行添加到luffycity.txt这份文件中输出屏幕
[root@kvm01 ~]# sed '3a I like linux.\nI like linux very much.' luffycity.txt 
His name is chaoge.
I teach Linux.
My linux is good.
I like linux.
I like linux very much.
My telphone is 00000000
His qq is 88888888.
His website is http://pythonav.cn.

# 将输出的结果写入到文件中
[root@kvm01 ~]# sed -i '3a I like linux.\nI like linux very much.' luffycity.txt && cat luffycity.txt 
His name is chaoge.
I teach Linux.
My linux is good.
I like linux.
I like linux very much.
My telphone is 00000000
His qq is 88888888.
His website is http://pythonav.cn.

在每行下面插入新内容

[root@kvm01 ~]# sed 'a -------------' luffycity.txt        
His name is chaoge.
-------------
I teach Linux.
-------------
My linux is good.
-------------
I like linux.
-------------
I like linux very much.
-------------
My telphone is 00000000
-------------
His qq is 88888888.
-------------
His website is http://pythonav.cn.
-------------
(5)、sed配合正则表达式

上一章节用 grep -E 扩展正则表达式,这一节使用sed配合正则表达式使用

  • 1、使用ifconfig命令获取当前Linux系统的IP地址并使用sed提取出来
# 方法一: 使用sed筛选出第二行的内容,配合awk进行查找第二段
[root@kvm01 ~]# ifconfig | sed '2p' -n
        inet 192.168.39.2  netmask 255.255.255.0  broadcast 192.168.39.255

[root@kvm01 ~]# ifconfig | sed '2p' -n | awk '{print$2}'
192.168.39.2

# 方法二: 
# 查看ens3网卡的信息,使用sed过滤第二行输出,然后用sed匹配inet前面的所有字段替换成空格,同理net后面所有字段也替换成空格
[root@kvm01 ~]# ifconfig ens3 | sed "2p" -n | sed 's/^.*inet//' | sed 's/net.*$//'
 192.168.39.2 
 
# 方法三: -e参数多次编辑,在第二行进行查找inet前的所有字符并替换成空格输出屏幕
[root@kvm01 ~]# ifconfig ens3 | sed -e '2s/^.*inet//p' -n 
 192.168.39.2  netmask 255.255.255.0  broadcast 192.168.39.255

# 在前面替换完后再对net后面的结果进行查找替换成空格输出,不输出第一次sed处理后的语句
[root@kvm01 ~]# ifconfig ens3 | sed -e '2s/^.*inet//' -n -e "2s/net.*$//p" -n 
 192.168.39.2  
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值