所在位置:首页 → 电脑知识 → Linux → shell专项:sed 文本选取、替换、删除、新增的命令

shell专项:sed 文本选取、替换、删除、新增的命令

发布: 更新时间:2023-02-16 02:02:07

sed主要是用来将数据进行选取、替换、删除、新增的命令。

一、语法

[root@localhost ~]$ sed [选项] '[动作]' 文件名

选项:
-n:  一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。
-e:  允许对输入数据应用多条sed命令编辑。
-f 脚本文件名: 从sed脚本中读入sed操作。和awk命令的-f非常类似。
-r:  在sed中支持扩展正则表达式。
-i:  用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

动作:
num a \: 追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。num表示第几行
c \: 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“”代表数据未完结。
num i \: 插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“”代表数据未完结。num表示第几行
d ; 删除,删除指定的行。
p : 打印,输出指定的行。
s : 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/"旧字串/新字串/g”(和vim中的替换格式类似)。

二、常用操作

1.提取行数据

还是使用student.txt来作展示。student.txt文件如下 :

[root@localhost ~]$ sed  '2p' student.txt
ID      Name    php   Linux  MySQL   Average
1       AAA      66         66       66           66
2       BBB      77         77       77           77
3       CCC      88         88       88           88

指定输出某行,使用-n选项

[root@localhost ~]$ sed -n  '2p' student.txt
1       AAA      66         66       66           66

2.删除行数据

[root@localhost ~]$ sed  '2,4d' student.txt
#删除第二行到第四行数据

3.追加插入行数据

[root@localhost ~]$ sed '2a hello' student.txt
#在第二行后加入 hello

“a”会在指定行后面追加入数据,如果想要在指定行前面插入数据,则需要使用“i”动作:

[root@localhost ~]$ sed '2i hello world' student.txt
#在第二行前插入两行数据

如果是想追加或插入多行数据,除最后一行外,每行的末尾都要加入“\n”代表数据未完结。

再来看看“-n”选项的作用:

[root@localhost ~]$ sed -n '2i hello world' student.txt
#只查看sed命令操作的数据

4.替换行数据

再来看看如何实现行数据替换,假设AAA的成绩太好了,我实在是不想看到他的成绩刺激我,那就可以使用"c"动作:

[root@localhost ~]$ cat student.txt | sed '2c No such person'

sed命令默认情况是不会修改文件内容的,如果我确定需要让 sed命令直接处理文件的内容,可以使用“-i”选项。不过要小心啊,这样非常容易误操作,在操作系统文件时请小心谨慎。可以使用这样的命令:

[root@localhost ~]$ sed -i '2c No such person' student.txt

5.字符串替换

“c”动作是进行整行替换的,如果仅仅想替换行中的部分数据,就要使用“s”动作了。g 使得 sed 对文件中所有符合的字符串都被替换, 修改后内容会到标准输出,不会修改原文件。

[root@localhost ~]$ sed 's/旧字串/新字串/g' 文件名
[root@localhost ~]$ sed '行范围s/旧字串/新字串/g' 文件名

替换的格式和vim非常类似,假设我觉得我自己的PHP成绩太低了,想作弊给他改高点,就可以这样来做:

[root@localhost ~]$ sed '3s/74/99/g' student.txt
#在第三行中,把74换成99

这样看起来就比较爽了吧。如果我想把AAA老师的成绩注释掉,让他不再生效。可以这样做:

[root@localhost ~]$ sed '2s/^/#/g' student.txt
#这里使用正则表达式,“^”代表行首

在sed中只能指定行范围,所以很遗憾我在他们两个的中间,不能只把他们两个注释掉,那么我们可以这样:

[root@localhost ~]$ sed -e 's/AAA//g ; s/BBB//g' student.txt
#同时把“Liming”和“Tg”替换为空

“-e”选项可以同时执行多个sed动作,当然如果只是执行一个动作也可以使用“-e”选项,但是这时没有什么意义。还要注意,多个动作之间要用“;”号或回车分割,例如上一个命令也可以这样写:

[root@localhost ~]$ sed -e 's/Liming//g
>s/Tg//g'’ student.txt
标签:, , , ,
文章排行