语法

sed [-nefri] 'command' file.txt

选项与参数:

-n :只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;可以一次修改多个规则,中间用 分号 隔开
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

命令 command :

a :新增, 指定行后面;
c :修改, 表示修改文件指定行的内容;
d :删除;
i :插入, 指定行前面;
p :打印,通常 p 会与参数 sed -n 使用;
s :查找替换;

一、向文件中添加行

命令:a:表示指定行后插入内容;i: 表示指定行前插入内容,下面演示指定行后插入内容。

# 原始文件内容
[root@vm114 ~]# cat sedfile 
111
222
333
444
555

1、在指定行后插入内容

# a 表示插入,3 表示行号,hello world 表示插入的内容
[root@vm114 ~]# sed '3ahello world' sedfile 
111
222
333
hello world
444
555

2、在指定内容后插入内容

# /444/ 表示通过正则找到 444 所在行,a 表示插入
[root@vm114 ~]# sed '/444/ahello world' sedfile 
111
222
333
444
hello world
555

3、在最后一插入内容

# $ 表示最后一行,a 表示插入
[root@vm114 ~]# sed '$ahello world' sedfile 
111
222
333
444
555
hello world

二、修改文件中行的内容

命令:c:表示修改文件指定行的内容

1、修改指定行的内容

# c 表示修改内容, 1 表示第一行
[root@vm114 ~]# sed '1chello world' sedfile 
hello world
222
333
444
555

2、修改指定内容行的内容

# 正则找到以 444 开头的所在行,然后修改整行内容
[root@vm114 ~]# sed '/^444/chello world' sedfile 
111
222
333
hello world
555

3、修改最后一行的内容

[root@vm114 ~]# sed '$chello world' sedfile 
111
222
333
444
hello world

三、删除文件指定的行

命令:d:表示删除文件中指定行的内容

1、删除指定的一行

# 删除第 4 行
[root@vm114 ~]# sed '4d' sedfile 
111
222
333
555

2、删除从第一行开始,每隔几行删除一行

# 从第一行开始删除,每隔2行就删掉一行,即删除奇数行
[root@vm114 ~]# sed '1~2d' sedfile 
222
444

3、删除指定的多行

# 删除第 2 到第 4 行之间的所有行
[root@vm114 ~]# sed '2,4d' sedfile 
111
555

# 删除除了第 2 到第 4 行之间的所有行
[root@vm114 ~]# sed '2,4!d' sedfile 
222
333
444

4、删除最后一行

[root@vm114 ~]# sed '$d' sedfile 
111
222
333
444

5、删除匹配正则表达式的行

# 删除 包含 33 的行
[root@vm114 ~]# sed '/33/d' sedfile
111
222
444
555

# 删除 包含 33 的行到最后一行
[root@vm114 ~]# sed '/33/,$d' sedfile
111
222

# 删除 包含33的行到下一行,这里的 +1 就是下一行,+2 就是下二行
[root@vm114 ~]# sed '/33/,+1d' sedfile
111
222
555

# 删除 包含 333 或 444 的行,| 表示或,这里前面加 \ 转义 
[root@vm114 ~]# sed '/333\|444/d' sedfile 
111
222
555

# 删除 第一行到第三行之间包含 22 的内容的所有行
[root@vm114 ~]# sed '1,3{/22/d}' sedfile 
111
333
444
555

# 删除空行
[root@vm114 ~]# cat sedfile 
111
222
333
444
555
[root@vm114 ~]# sed '/^$/d' sedfile 
111
222
333
444
555


四、替换文件中的内容

命令:s:表示查找并替换

# s 表示查找,查找 222 替换成 aaa
[root@vm114 ~]# sed 's/222/aaa/' sedfile 
111
aaa
333
444
555

# g 表示全部替换
sed 's/222/aaa/g' sedfile   

# i 表示忽略大小写 
sed 's/222/aaa/i' sedfile

# w 表示保存
sed 's/222/aaa/w aaa.txt' sedfile   

# 参数 -n:表示只显示处理过的行,p 表示打印匹配的内容,通常与 -n 选项连用
[root@vm114 ~]# sed -n 's/222/aaa/pw aaa.txt' sedfile
aaa

# 给包含指定的内容行添加注释,&的意思是匹配任意字符
[root@vm114 ~]# sed 's/^33/#&/' sedfile 
111
222
#333
444
555

# 删除包含指定内容行的注释, \1 指的就是正则A中的第一个group,即A中第一个小括号里匹配到的内容
[root@vm114 ~]# sed 's/^#\(33\)/\1/' sedfile
111
222
333
444
555

[root@vm114 ~]# cat test 
111
#222
333
#444
555

# 这里查找所有以#开头的行全部替换成空行 参数:^# 表示匹配以#开头,参数:.* 代表所有内容
[root@vm114 ~]# sed 's/^#.*//' test 
111

333

555

# 这里查找所有以#开头的行全部替换成空行,并删除空行  替换与删除之间用分号;分隔
[root@vm114 ~]# sed 's/^#.*//;/^$/d' test 
111
333
555

# 查找每行中的最后两个字符为aa,每个点代给一个字符,$表示匹配末尾,..$表示匹配最后两个字符
[root@vm114 ~]# sed 's/..$/aa/' test
1aa
#2aa
3aa
#4aa
5aa
[root@vm114 ~]# cat test2
1 tom
2 jack
3 alice
4 helen
5 tony

# 查找以数字开头的内容,并加上小括号 参数&:表示匹配的内容
[root@vm114 ~]# sed 's/^[0-9]/(&)/' test2
(1) tom
(2) jack
(3) alice
(4) helen
(5) tony

# 查找每一行结尾,并在结尾处加上 is betst
[root@vm114 ~]# sed 's/$/& is best/' test2
1 tom is best
2 jack is best
3 alice is best
4 helen is best
5 tony is best

五、打印文件中的行

命令:p:表示打印匹配的内容,通常与 -n 连接使用

# 打印文件中所有的行,不加-n,将显示两行
sed -n 'p' sedfile

# 显示第三行
sed -n '3p' sedfile

# 从第一行开始,每隔2行打印一行,波浪号后面的2表示步长
sed -n '1~2p' sedfile

# 打印最后一行
sed -n '$p' sedfile

# 打印1到3行
sed -n '1,3p' sedfile

六、从文件中读取内容

命令:r:表示把一个文件读取到当前文件

# 从test文件第三行开始读取test2文件
[root@vm114 ~]# sed '3r test2' test
111
#222
333
1 tom
2 jack
3 alice
4 helen
5 tony
#444
555

# 查找test文件匹配222所在行之后,读入test2文件
sed '/222/r test2' test

# 在test文件最后一行,读入test2文件
sed '$r test2' test

七、向文件中写入内容

命令:w:表示把当前文件内容写入到另一个文件

# 把test2的内容写入test3
sed -n 'w test3' test2

# 把test2文件中第二行内容写入test3
sed -n '2w test3' test2

# 把test2中的第二行和第二行的内容写入test3
sed -n -e '2w test3' -e '4w test3' test2

# 把test2中的包含jack和tony所在行写入test3
sed -n '/jack\|tony/w test3' test2

# 匹配test2中包含jack的行到最后一行的内容写入test3
sed -n '/jack/,$w test3' test2

# 匹配test2中包含jack的行及其后面二行的内容写入test3
sed -n '/jack/,+2w test3' test2

八、模式空间与暂存空间

h,H 模式空间上传到暂存空间;g,G 暂存空间下载到模式空间

# 实现把第一行数据,复制到最后一行
# 功能:1h 表示把第一行数据覆盖到暂存空间,$G 表示最后一行时,把暂存空间的数据加载进来
[root@vm114 ~]# sed '1h;$G' sedfile 
111
222
333
444
555
111

# 实现把前行数据,复制到最后一行
# 功能:1h 表示把第一行数据覆盖到暂存空间,2,3H 表示把2~3行追到暂存空间,$G 表示最后一行时加载进来
[root@vm114 ~]# sed '1h;2,3H;$G' sedfile 
111
222
333
444
555
111
222
333