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
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END