1.简介
sed全名叫stream editor,流编辑器,用程序的方式编辑文本,与vim的交互式编辑截然不同。
在sed命令处理数据之前,需要预先提供一组规则,sed命令会按照这个规则来编辑数据。
2.使用场景
-
自动化程序中,不适合交互方式编辑的;
-
大批量重复性的编辑需求;
-
编辑命令太过复杂,在交互文本编辑器难以输入的情况;
3.工作原理
sed作为一款非交互式编辑器,它使用预先设计好的编辑指令对输入的文本进行编辑,完成之后输出编辑结果。
原理
- sed从输入文件中读取内容,每次处理一行内容,并把当前的一行内容储存在临时的缓冲区,称为“模式空间”。
- sed命令处理缓存区中的内容;
- 处理完毕后把缓存区的内容输出到屏幕;
- 接着处理下一行;
- 这样不断重复,直到文件末尾,文件内容并没有发生改变,除非你使用了重定向输出或制定了i的参数。
4.sed语法格式
sed的命令模式:sed [选项] 地址范围 动作 file1 file2 .....
sed的脚本格式:sed [选项] -f scriptfile file(s)
选项
-e :直接在命令行模式上进行sed动作编辑,此为默认选项;
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
-i :直接修改文件内容;
-n :只打印模式匹配的行;
-r :支持扩展表达式;
-h或--help:显示帮助;
-V或--version:显示版本信息。
sed常用命令
a /内容 在当前行下面插入文本;
i /内容 在当前行上面插入文本;
c /内容 把选定的行改为新的文本;
d 删除,删除选择的行;
D 删除模板块的第一行;
s 替换指定字符;
h 拷贝模板块的内容到内存中的缓冲区;
H 追加模板块的内容到内存中的缓冲区;
g 获得内存缓冲区的内容,并替代当前模板块中的文本;
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面;
l 列表不能打印字符的清单;
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码;
p 打印模板块的行。 P(大写) 打印模板块的第一行;
q 退出Sed;
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾;
r file 从file中读行;并将file中的内容添加到符合条件的行处
W file 写并追加模板块的第一行到file末尾;
! 表示后面的命令对所有没有被选定的行发生作用;
= 打印当前行号;
# 把注释扩展到下一个换行符以前;
sed替换标记
g 表示行内全面替换;
p 表示打印行;
w 表示把行写入一个文件;
x 表示互换模板块中的文本和缓冲区中的文本;
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式);
/1 子串匹配标记;
& 已匹配字符串标记;
sed元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行;
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行;
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d;
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行;
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed;
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行;
/(../) 匹配子串,保存匹配的字符,如s//(love/)able//1rs,loveable被替换成lovers;
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**;
/< 匹配单词的开始,如://
/> 匹配单词的结束,如/love/>/匹配包含以love结尾的单词的行;
x/{m/} 重复字符x,m次,如:/0/{5/}/匹配包含5个0的行;
x/{m,/} 重复字符x,至少m次,如:/0/{5,/}/匹配至少有5个0的行;
x/{m,n/} 重复字符x,至少m次,不多于n次,如:/0/{5,10/}/匹配5~10个0的行;
实例
实例1 删除行-d
[root@yaoguang ~]# sed '1,2'd text.txt #删除第一行到第二行
33
44
55
66
[root@yaoguang ~]# cat text.txt
11
22
33
44
55
66
[root@yaoguang ~]# sed '3,$'d text.txt #删除第三行到最后一行
11
22
[root@yaoguang ~]# sed '/^1'/d text.txt #删除以1开头的行
22
33
44
55
66
实例2 打印输出-p
[root@yaoguang ~]# sed -n '3p' text.txt
33
[root@yaoguang ~]# sed -n '/^4/p' text.txt
44
实例3 行下面插入内容-a
[root@yaoguang ~]# sed '/^3/a /#zhe shi cha ru de nei nei rong' text.txt #在以3开头的行下面插入
11
22
33
#zhe shi cha ru de nei nei rong
44
55
66
[root@yaoguang ~]# sed '4a /#zhe shi cha ru de nei nei rong' text.txt #在第四行下面按插入
11
22
33
44
#zhe shi cha ru de nei nei rong
55
66
实例4 从file中读行;并将file中的内容添加到符合条件的行处
[root@yaoguang ~]# sed '2r /etc/fstab' text.txt #/etc/fstab里的内容被读进来,显示在与2匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面
11
22
#
# /etc/fstab
# Created by anaconda on Mon Feb 14 00:44:55 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=61c45d45-61a2-40d7-b27e-31e4050c1ff8 / ext4 defaults
1 133
44
55
66
实例5 将fstab文件里面包含UUID的行写入到text.txt文件里面(覆盖text.txt文件里面的原内容)
[root@yaoguang ~]# sed '/UUID/w text.txt' fstab
[root@yaoguang ~]# cat text.txt
UUID=61c45d45-61a2-40d7-b27e-31e4050c1ff8 / ext4 defaults
1 1
实例6 替换
[root@yaoguang ~]# sed 's/11/00/' text.txt #第一种方式
00
22
33
44
55
[root@yaoguang ~]# sed '1 c 99' text.txt #第二种方式
99
22
33
44
55
[root@yaoguang ~]# cat text.txt
11
22
33
44
55
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/245529.html