博客
关于我
Linux - 不得不知的利器(sed)
阅读量:139 次
发布时间:2019-02-26

本文共 2489 字,大约阅读时间需要 8 分钟。

sed是最早开始支持正则表达式的工具之一。我们可以使用sed非常轻松地完成非交互式的文件编辑工作。例如对文件的增、删、改、查等操作。

sed命令介绍

sed会逐行扫描输入的数据,并将读取读取的内容复制到缓冲区中,我们称之为模式空间,然后拿着模式空间中的数据与给定的条件进行匹配,如果匹配成功则执行特定的sed指令。否则sed会跳过输入的数据行,继续读取后续的数据。

sed命令格式

sed [options] ‘command’ file(s)

sed [options] -f scriptfile file(s)

sed常用的命令选项

-n 屏幕默认输出功能,默认sed会把匹配到的数据显示在屏幕上

-r 支持华展正则
-i 直接修改源文件,如果设置了SUFFIX后缀名,sed会将数据备份
-e 指定需要执行sed指令,支持使用多个-e参数
-f 指定需要执行的脚本文件,需要提前将sed指令写入文件中

sed 基本操作指令

p 打印当前匹配的数据行

l 小写l,打印当前匹配的数据行
= 打印当前读取的数据行数
a text 在匹配的数据行后面追加文本内容
i text 在匹配的数据行前面插入文本内容
d 删除匹配的数据行整行内容
c text 将匹配的数据行内容替换为特定的文本内容
r filename 从文件中读取数据并追加到匹配的数据行后面
w filename 将当前匹配到的数据写入特定的文件中
q 立刻退出sed脚本

sed指令执行前需要先根据条件定位需要处理的数据行,如果没有指定定位条件,则默认sed会对所有数据行执行特定的指令。

sed支持的数据定位方法

number 直接根据行号匹配数据

first~step 从first行开始,步长为step,匹配所有满足条件呢的数据行
$ 匹配最后一行
/regexp/ 使用正则表达式匹配数据行
\cregexpc 使用正则表达式匹配数据行,c可以是任意字符
addr1,addr2 直接使用行号定位,匹配从addr1到addr2的所有字符
addr1,+N 直接使用行号定位,匹配从addr1开始及后面的N行

sed 'p' /etc/hosts

在这里插入图片描述

当没有指定条件时,默认会匹配所有的数据行,因此/etc/hosts文件有多少行p指令就执行多少次。sed读取文件的第一1行执行p指令将改行内容显示在屏幕上,接着读取文件的第2行继续执行p指令再将改行内容显示在屏幕上。

可以你们也会看到了,为什么每个数据行却打印显示了两次呢?因为哪怕没有p指令,sed也会默认读取到的数据行显示在屏幕上,所以p指令数据行被打印显示了一次,接着sed默认又将读取的数据行再显示了一次,最终每行显示两次。可以使用-n选项屏蔽sed默认的输出功能。关闭默认的输出功能后,所有的数据行将仅显示一次。

sed -n 'p' /etc/hosts

所有数据仅显示一次
在这里插入图片描述
仅显示文件的第1行或者第2行
在这里插入图片描述
sed支持从管道读取数据
在这里插入图片描述
在这里插入图片描述
当没有指定任何匹配的条件时,sed将匹配所有的数据行。但是,sed也支持多种方式定位特定的数据行,直接写行号就是最直接的一种方式,其他如正则表达式等方式也很实用。满足条件的行才会执行sed指令,否则不做任何操作,sed继续读取文件下的行内容,直到文件结尾程序退出。

显示文件的第1列到第3列

在这里插入图片描述

多条指令使用分号分隔

在这里插入图片描述

显示第3列到末尾所有行

在这里插入图片描述

(输出信息太多,只截取一点内容输出)

只显示偶数行

在这里插入图片描述

如果想输入奇数行可以使用(sed -n ‘1~2p’ /etc/passwd)

显示文件最后一行的内容

在这里插入图片描述

上面介绍都是使用行号,下面介绍使用正则表达式定位特定的数据行。

匹配以bash结尾的行并显示

在这里插入图片描述

匹配包含数字的行并显示
在这里插入图片描述
(忽略部分输出的内容)

显示以http开头的数据行

在这里插入图片描述

开启扩展正则功能

在这里插入图片描述

正则匹配包含bash的行并显示
在这里插入图片描述

还可以这样匹配

在这里插入图片描述

或者这样啊

在这里插入图片描述

下面使用sed程序使用=指令可以显示行号,结合条件匹配,这样可以显示特定的数据行的行号

在这里插入图片描述

显示第n行的行号

在这里插入图片描述

显示/etc/shells最后一行的行号

在这里插入图片描述

在sed中可以使用感汉号(!) 对匹配的条件进行取反操作

在这里插入图片描述

除含bash外的所有行都显示

在这里插入图片描述

下面对源文件进行备份,再使用sed -i进行测试sed指令是否正确。

在这里插入图片描述

在实战中,是先不使用sed指令是否正确,确认无误后再使用-i修改源文件,或者对源文件进行备份操作。

下面先将文件备份为后缀名称.bak的文件,再修改源文件的内容,将/tmp/hosts文件的第2行删除,d指令是以行为单位进行删除的指令。

在这里插入图片描述

修改源文件

在这里插入图片描述

下面的演示都不再使用-i选项。

删除第2行内容

在这里插入图片描述

所有行替换为新内容

在这里插入图片描述

注意: 前面的例子中我们使用c和d对数据进行修改操作和删除操作,但是这两个指令都以行为单位,c会将整行内容都替换,d会将整行内容都删除。而在实际工作中我们经常需要将某个关键字替换,或者删除某个关键字,此时就需要使用s指令来完成的工作。

test.txt

hello the world

hello minger
golang
python
c/c++
linux

在这里插入图片描述

上面这条命令在s前面没有写匹配条件,因此是匹配所有数据行。

没有使用-i选项,源文件不变。

在这里插入图片描述
仅替换每行的第一个o

在这里插入图片描述

上面的信息是将小写的字母o替换为大写字母O,但是我们会发现如果一行中有多个字母o,sed默认仅仅会将第一个字母o替换为大写。如果需要替换每行所有的小写字母o,则需要在s指令指令的末尾追加一个g标记。

仅显示被替换的数据行

在这里插入图片描述

总结

有时候我们需要对文件进行的增、删、改比较多,虽然sed可以使用使用分号在一行中分隔多个指令,但是当指令很多时并不是很方便,对于指令比较多的情况,我们可以先将所有sed指令写入一个文本文件中,然后通过sed 的-f选项读取该指令文件即可实现多个指令操作。今天就说这了。后期会讲解sed的高级指令操作。

在这里插入图片描述

欢迎关注微信公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:

在这里插入图片描述

转载地址:http://oziy.baihongyu.com/

你可能感兴趣的文章
mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
查看>>
mysqldump 参数--lock-tables浅析
查看>>
mysqldump 导出中文乱码
查看>>
mysqldump 导出数据库中每张表的前n条
查看>>
mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
查看>>
Mysqldump参数大全(参数来源于mysql5.5.19源码)
查看>>
mysqldump备份时忽略某些表
查看>>
mysqldump实现数据备份及灾难恢复
查看>>
mysqldump数据库备份无法进行操作只能查询 --single-transaction
查看>>
mysqldump的一些用法
查看>>
mysqli
查看>>
MySQLIntegrityConstraintViolationException异常处理
查看>>
mysqlreport分析工具详解
查看>>
MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
查看>>
Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
查看>>
mysql_real_connect 参数注意
查看>>
mysql_secure_installation初始化数据库报Access denied
查看>>
MySQL_西安11月销售昨日未上架的产品_20161212
查看>>
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>