- 1、sed命令说明
- 2、行数据操作
- (1)查看文件中的数据
- (2)删除文件中的数据
- (3)向文件中追加数据
- (4)向文件中插入数据
- (5)修改文件中的多行数据(删除,追加,插入)
- (6)替换文件中的整行文本
- (7)字符串替换
- (8)同时执行多条动作
- 3、总结
sed主要是用来将数据进行选取、替换、删除、新增的命令,grep,awk,sed称为是文本操作三剑客。
我们看看sed命令的语法格式:
[root@localhost ~]# sed [选项] '[动作]' 文件名
选项:
-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。-e:允许对输入数据应用多条sed命令编辑。-f 脚本文件名:从sed脚本中读入sed操作。和awk命令的-f非常类似。-r:在sed中支持扩展正则表达式。-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出。
动作:
a \:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用\代表数据未完结。(如果不添加多行,就忽略\)c \:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用\代表数据未完结。(如果不添加多行,就忽略\)i \:插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用\代表数据未完结。(如果不添加多行,就忽略\)d:删除,删除指定的行。p:打印,输出指定的行。s:字串替换,用一个字符串替换另外一个字符串。格式为行范围 s/旧字串/新字串/g(和vim中的替换格式类似)。
提示:
对于
sed命令大家要注意,sed所做的修改并不会直接改变文件的内容(如果是用管道符接收的命令的输出,这种情况连文件都没有),而是把修改结果只显示到屏幕上,除非使用-i选项才会直接修改文件。
2、行数据操作小说明:
vim可以直接修改文件内容,我们使用的也非常多,为什么还要学sed命令呢?因为
vim需要我们手动和计算机交互,需要手动输入一些编辑指令,保存指令,切换模式指令等,才能完成vim的编辑操作。在Shell中很难做到人机交互,所以
vim操作没有办法在Shell程序使用,因此要通过sed命令来完成,这是Shell中修改文件内容最最最主要的方式。
使用如下文本student.txt:
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96,66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
(1)查看文件中的数据
我们举几个例子来看看sed命令到底是干嘛的。
查看下student.txt文件的第二行,那么就可以利用p动作,执行如下命令:
[root@localhost tmp]# sed '2p' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
从上面的结果可以看出,p命令确实输出了第二行数据,但是sed命令还会把所有数据都输出一次,这时就会看到这个比较奇怪的结果,第二行的数据有两次的输出。
那如果想指定输出某行数据,就需要-n选项的帮助。
[root@localhost tmp]# sed -n '2p' student.txt
1 Tangs 88 87 86 85.55
(2)删除文件中的数据
删除student.txt文本中第二行到第四行的数据,命令如下:
[root@localhost tmp]# sed '2,4d' student.txt
ID Name Python Linux MySQL Java
4 Shahs 66 65 64 63.33
2,4表示删除2至4行的数据。
但是这里要注意的是,我上边的操作,并没有写入到文件中,我们可以查看student.txt文本中的内容:
[root@localhost tmp]# cat student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
可以看到student.txt文本中的内容还在,sed命令只是在输出的时候,把数据过滤掉了。
如果需要在删除内容的同时,再写入文件,就需要-i选项了。
执行命令:
[root@localhost tmp]# sed -i '2,4d' student.txt就可以了。
需求:在student.txt文本中第三行后面添加66666666666666。
执行命令如下:
[root@localhost tmp]# sed "3a 66666666666666" student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
66666666666666
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
同理,student.txt文本中的内容并没有被改变,如果需要改变student.txt文本中的内容,添加-i选项。
注意:sed命令的选项要写在单引号(双引号也可以)之外,如:
[root@localhost tmp]# sed -i "3a 66666666666666" student.txt
需求:在student.txt文本中第三行前面添加88888888888。
执行命令如下:
[root@localhost tmp]# sed "3i 88888888888888" student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
88888888888888
2 Sunwk 99 98 97 96.66
66666666666666
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
同理,需要把修改写入文件,需要添加-i选项。
如果是想追加或插入多行数据,除最后一行外,每行的末尾都要加入\代表数据未完结。
需求:向student.txt文本中第二行后面追加hello world。
执行如下命令:
[root@localhost tmp]# sed '2a hello \
> world' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
hello
world
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
(引号不完全是不会执行的)
提示:我发现换行后tab键提示功能不能用了。(不清楚怎么回事)
这里在说明一下-n选项,-n选项只会把经过sed命令处理的行输出到屏幕。
执行如下命令:
[root@localhost tmp]# sed -n '2a hello \
world' student.txt
hello
world
(6)替换文件中的整行文本
需求:替换student.txt文本中的第二行数据为999999999999999。
执行如下命令:
[root@localhost tmp]# sed '2c 999999999999999' student.txt
ID Name Python Linux MySQL Java
999999999999999
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
(7)字符串替换注意:
sed命令默认情况是不会修改文件内容的,如果确定需要让sed命令直接处理文件的内容,可以使用-i选项。不过要小心啊,这样非常容易误操作,在操作系统文件时请小心谨慎。
在sed中c动作是进行整行替换的,如果仅仅想替换行中的部分数据,就要使用s动作了。
需求:修改Zhubj的Java成绩为100。
执行如下命令:
# 命令格式
[root@localhost tmp]# sed 's/旧字串/新字串/g' 文件名
# 执行命令
[root@localhost tmp]# sed 's/74.44/100/g' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 100
4 Shahs 66 65 64 63.33
# 或者对行范围更精准一些
[root@localhost tmp]# sed '4s/74.44/100/g' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 77 76 75 100
4 Shahs 66 65 64 63.33
(8)同时执行多条动作注意:
4s/74.44/100/g表达式中s和/之间不能有空格。如果
4s/74.44/100/g不写行号,也就是上面第一种写法,就代表替换整个文档中的匹配字符串。
在sed命令中,-e选项可以同时执行多个sed动作,当然如果只是执行一个动作也可以使用-e选项,但是这时-e选项是没有什么意义的。
还要注意多个动作之间要用;号或回车分割。
练习1:
需求:把Shahs的成绩注释掉,并且把Zhubj的Python成绩改成100。
执行命令如下:
# 使用;分号的方式隔离多条动作
[root@localhost tmp]# sed -e '5s/^/#/g ; 4s/77/100/g' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 100 76 75 74.44
#4 Shahs 66 65 64 63.33
注意:
^代表行首,是正则表达式,不用加-r选项也可以。其实上面命令中不写
-e选项,命令也是可以执行的,应该是默认识别的。但是我们尽量规范书写。
# 使用回车的方式隔离多条动作
[root@localhost tmp]# sed -e '5s/^/#/g
> 4s/77/100/g' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 100 76 75 74.44
#4 Shahs 66 65 64 63.33
注意:使用回车的方式进行动作之间的分隔,就不能在写分号
;了。
特别注意:
在
sed命令中有多条动作执行的时候,且有多个选项的时候,-e选项要紧挨动作表达式,否则会报错。例如:
-i -e '5s/^/#/g'正确,
-e -i '5s/^/#/g'报错。
练习2:
删除字符串使用sed命令的d操作是不能实现的,因为d操作是删除整行。这时就需要字符串替换,也就是sed命令的s动作来完成。
需求:删除Zhubj的Python成绩。
执行如下命令:
# 用空代替
[root@localhost tmp]# sed '4s/77//g' student.txt
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96.66
3 Zhubj 76 75 74.44
4 Shahs 66 65 64 63.33
3、总结
什么时候需要使用sed命令?
如果需要在脚本程序中,修改文件中的数据,这种情况下我们就需要使用sed命令。
