Linux之sed命令详解

mac2024-07-02  62

sed是一个流编辑器,非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“缓冲空间”(pattern space) 。接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。

文件内容并没有改变,除非使用重定向存储输出。

sed用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

1.sed语法

sed [选项] [sed指令] [输入文件] ​ 选项参数: p==显示在模式空间的内容 d:删除 =: 打印匹配行的行号 -n: 取消默认的完整输出,只要需要的   -e: 允许多项编辑 -i: 修改文件内容 -r: 支持拓展正则表达式(|、() ) s///:查找替换,其分隔符可自行制定,常见的有s@@@,s### 命令参数: a:在当前行后添加一行或多行 c:在当前行进行替换修改 d:在当前行进行删除操作 i:在当前行之前插入文本 p:打印匹配的行或指定行 n:读入下一输入行,从下一条命令进行处理 !:对所选行以外的所有行应用命令 h:把模式空间里的内容重定向到暂存缓冲区 H:把模式空间里的内容追加到暂存缓冲区 g:取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容 G:取出暂存缓冲区的内容,将其复制到模式空间,追加该处原有内容

2.sed常用命令

创建测试文件

[root@yfy ~]# cat>person.txt<<EOF > 101,zhangsan,CEO > 102,lisi,CTO > 103,Alex,COO > 104,wangwu,CFO > 105,zhaoliu,CIO > EOF

(1)查询

只打印第一行

[root@yfy ~]# sed -n '1p' person.txt 101,zhangsan,CEO

查看第3到4行

[root@yfy ~]# sed -n '4,5p' person.txt 104,wangwu,CFO 105,zhaoliu,CIO

包含Alex的行

[root@yfy ~]# sed -n '/Alex/p' person.txt 103,Alex,COO

最后一行

[root@yfy ~]# sed -n '$p' person.txt 105,zhaoliu,CIO

已w开头,u结尾的行

[root@yfy ~]# sed -n '/w.*u/p' person.txt 104,wangwu,CFO

从包含101的行到包含104的行

[root@yfy ~]# sed -n '/101/,/104/p' person.txt 101,zhangsan,CEO 102,lisi,CTO 103,Alex,COO 104,wangwu,CFO

查询有zhangsan或者lisi的行

如果只用-n是查不出来的,因为默认情况下,sed只支持基本正则表达式。

[root@yfy ~]# sed -rn '/lisi|wangwu/p' person.txt 102,lisi,CTO 104,wangwu,CFO

查询指定分行

[root@yfy ~]# sed -n '2p;4p' person.txt 102,lisi,CTO 104,wangwu,CFO

将符合制定内容的文本存入另一个文本中

[root@yfy ~]# sed -n '/^104/w hello.txt' person.txt [root@yfy ~]# cat hello.txt 104,wangwu,CFO

通过正则取出绝对路径

[root@yfy ~]# echo "/var/log/messages" |sed 's#/.*/##' messages

(2)新增

a ====== append 追加

i ====== insert 插入

在第二行后面加一个新行

[root@yfy ~]# sed '2a hello world' person.txt 101,zhangsan,CEO 102,lisi,CTO hello world 103,Alex,COO 104,wangwu,CFO 105,zhaoliu,CIO

在第二行插入一行

[root@yfy ~]# sed '2i hello world' person.txt 101,zhangsan,CEO hello world 102,lisi,CTO 103,Alex,COO 104,wangwu,CFO 105,zhaoliu,CIO

(3)删除

删除第一行

[root@yfy ~]# sed '1d' person.txt 102,lisi,CTO 103,Alex,COO 104,wangwu,CFO 105,zhaoliu,CIO

显示文件内容但是不包含Alex

方法一:

[root@yfy ~]# grep -v "Alex" person.txt 101,zhangsan,CEO 102,lisi,CTO 104,wangwu,CFO 105,zhaoliu,CIO

方法二:

[root@yfy ~]# sed '/Alex/d' person.txt 101,zhangsan,CEO 102,lisi,CTO 104,wangwu,CFO 105,zhaoliu,CIO

方法三:

[root@yfy ~]# awk '!/Alex/d' person.txt 101,zhangsan,CEO 102,lisi,CTO 103,Alex,COO 104,wangwu,CFO 105,zhaoliu,CIO

方法四:

[root@yfy ~]# sed -n '3!p' person.txt 101,zhangsan,CEO 102,lisi,CTO 104,wangwu,CFO 105,zhaoliu,CIO  

删除配置文件中#开头的注释行

[root@yfy ~]# sed '/^#/d' my.cnf

(4)修改

指定某行进行内容替换

[root@yfy ~]# sed -i '7c SELINUX=Disabled' /etc/selinux/config

正则匹配对应内容,然后进行替换

[root@yfy ~]# sed -i '/^SELINUX=/c SELINUX=Disabled' /etc/selinux/config

(5)替换

's/old/new/g'

's#old#new#g'

's@old@new@g'

s#old#new#:只会替换每一行的第一个内容

将所有数字替换成*

[root@yfy ~]# sed 's#[0-9]#*#g' person.txt ***,zhangsan,CEO ***,lisi,CTO ***,Alex,COO ***,wangwu,CFO ***,zhaoliu,CIO

将每一行的第一个数字替换成*

[root@yfy ~]# sed 's#[0-9]#*#' person.txt *01,zhangsan,CEO *02,lisi,CTO *03,Alex,COO *04,wangwu,CFO *05,zhaoliu,CIO

3.练习

反向引用获取id

 

[root@yfy ~]# cat >ifconfig.txt<<EOF > 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 332 bytes 32372 (31.6 KiB) >         RX errors 0 dropped 0 overruns 0 frame 0 >         TX packets 332 bytes 32372 (31.6 KiB) >         TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 > EOF [root@yfy ~]# cat ifconfig.txt |sed -nr 's#.*net (.*) net.*#\1#p' 127.0.0.1
最新回复(0)