本文共 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列到第3列
多条指令使用分号分隔
显示第3列到末尾所有行
只显示偶数行
显示文件最后一行的内容
上面介绍都是使用行号,下面介绍使用正则表达式定位特定的数据行。
匹配以bash结尾的行并显示
显示以http开头的数据行
还可以这样匹配
或者这样啊
下面使用sed程序使用=指令可以显示行号,结合条件匹配,这样可以显示特定的数据行的行号
显示第n行的行号
显示/etc/shells最后一行的行号
在sed中可以使用感汉号(!) 对匹配的条件进行取反操作
除含bash外的所有行都显示
sed -i
进行测试sed指令是否正确。 在实战中,是先不使用sed指令是否正确,确认无误后再使用-i修改源文件,或者对源文件进行备份操作。
下面先将文件备份为后缀名称.bak的文件,再修改源文件的内容,将/tmp/hosts文件的第2行删除,d指令是以行为单位进行删除的指令。
修改源文件
删除第2行内容
所有行替换为新内容
注意: 前面的例子中我们使用c和d对数据进行修改操作和删除操作,但是这两个指令都以行为单位,c会将整行内容都替换,d会将整行内容都删除。而在实际工作中我们经常需要将某个关键字替换,或者删除某个关键字,此时就需要使用s指令来完成的工作。
test.txt
hello the world
hello minger golang python c/c++ linux
上面这条命令在s前面没有写匹配条件,因此是匹配所有数据行。
没有使用-i选项,源文件不变。
仅显示被替换的数据行
总结
有时候我们需要对文件进行的增、删、改比较多,虽然sed可以使用使用分号在一行中分隔多个指令,但是当指令很多时并不是很方便,对于指令比较多的情况,我们可以先将所有sed指令写入一个文本文件中,然后通过sed 的-f选项读取该指令文件即可实现多个指令操作。今天就说这了。后期会讲解sed的高级指令操作。
欢迎关注微信公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:
转载地址:http://oziy.baihongyu.com/