【现学现忘&Shell编程】— 36.sed命令(二)
(4)向文件中插入数据
需求:在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
选项。
(5)修改文件中的多行数据(删除,追加,插入)
如果是想追加或插入多行数据,除最后一行外,每行的末尾都要加入\
代表数据未完结。
需求:向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
注意:
sed
命令默认情况是不会修改文件内容的,如果确定需要让sed
命令直接处理文件的内容,可以使用-i
选项。不过要小心啊,这样非常容易误操作,在操作系统文件时请小心谨慎。
(7)字符串替换
在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
注意:
4s/74.44/100/g
表达式中s
和/
之间不能有空格。如果
4s/74.44/100/g
不写行号,也就是上面第一种写法,就代表替换整个文档中的匹配字符串。
(8)同时执行多条动作
在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
命令。