详情参考
1 sed基本使用 sed主要是用来将数据进行选取、替换、删除、新增的命令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 语法: [root@localhost ~]$ sed [选项] ‘[动作]’ 文件名 选项: -n: 一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。 -e: 允许对输入数据应用多条sed命令编辑。 -f 脚本文件名: 从sed脚本中读入sed操作。和awk命令的-f非常类似。 -r: 在sed中支持扩展正则表达式。 -i: 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出 动作: a : 追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。num表示第几行 c : 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“”代表数据未完结。 i : 插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“”代表数据未完结。num表示第几行 d ; 删除,删除指定的行。 p : 打印,输出指定的行。 s : 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/"旧字串/新字串/g”(和vim中的替换格式类似)。
对sed命令大家要注意,sed所做的修改并不会直接改变文件的内容(如果是用管道符接收的命令的输出,这种情况连文件都没有),而是把修改结果只显示到屏幕上,除非使用“-i”选项才会直接修改文件。
sed条件 sed修改 2 使用实例 提取行数据 我们举几个例子来看看sed命令到底是干嘛的。假设我想查看下student.txt的第二行,那么就可以利用“p”动作了:
1 2 3 4 5 [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选项
1 2 [root@localhost ~]$ sed -n '2p' student.txt 1 AAA 66 66 66 66
删除行数据 1 2 [root@localhost ~]$ sed '2,4d' student.txt #删除第二行到第四行数据
插入行数据 1 2 [root@localhost ~]$ sed '2a hello' student.txt #在第二行后加入 hello
“a”会在指定行后面追加入数据,如果想要在指定行前面插入数据,则需要使用“i”动作:
1 2 [root@localhost ~]$ sed '2i hello world' student.txt #在第二行前插入两行数据
如果是想追加或插入多行数据,除最后一行外,每行的末尾都要加入“\”代表数据未完结。再来看看“-n”选项的作用:
1 2 [root@localhost ~]$ sed -n '2i hello world' student.txt #只查看sed命令操作的数据
替换行数据 “-n”只查看sed命令操作的数据,而不是查看所有数据。 再来看看如何实现行数据替换,假设AAA的成绩太好了,我实在是不想看到他的成绩刺激我,那就可以使用”c”动作:
1 [root@localhost ~]$ cat student.txt | sed '2c No such person'
sed命令默认情况是不会修改文件内容的,如果我确定需要让 sed命令直接处理文件的内容,可以使用“-i”选项。不过要小心啊,这样非常容易误操作,在操作系统文件时请小心谨慎。可以使用 这样的命令:
1 [root@localhost ~]$ sed -i '2c No such person' student.txt
字符串替换 “c”动作是进行整行替换的,如果仅仅想替换行中的部分数据,就要使用“s”动作了。g 使得 sed 对文件中所有符合的字符串都被替换, 修改后内容会到标准输出,不会修改原文件。
1 2 [root@localhost ~]$ sed 's/旧字串/新字串/g' 文件名 [root@localhost ~]$ sed '行范围s/旧字串/新字串/g' 文件名
替换的格式和vim非常类似,假设我觉得我自己的PHP成绩太低了,想作弊给他改高点,就可以这样来做:
1 2 [root@localhost ~]$ sed '3s/74/99/g' student.txt #在第三行中,把74换成99
这样看起来就比较爽了吧。如果我想把AAA老师的成绩注释掉,让他不再生效。可以这样做:
1 2 [root@localhost ~]$ sed '2s/^/#/g' student.txt #这里使用正则表达式,“^”代表行首
在sed中只能指定行范围,所以很遗憾我在他们两个的中间,不能只把他们两个注释掉,那么我们可以这样:
1 2 [root@localhost ~]$ sed -e 's/AAA//g ; s/BBB//g' student.txt #同时把“Liming”和“Tg”替换为空
“-e”选项可以同时执行多个sed动作,当然如果只是执行一个动作也可以使用“-e”选项,但是这时没有什么意义。还要注意,多个动作之间要用“;”号或回车分割,例如上一个命令也可以这样写:
1 2 [root@localhost ~]$ sed -e 's/Liming//g >s/Tg//g'’ student.txt