轻量的流编辑器 sed命令
sed是一种几乎包括所有UNIX平台(包括Linux)的轻量级的流编辑器。sed命令主要是用来对数据进行选取、替换、删除、新增等操作。
命令语法:sed [选项] ‘[动作]’ 文件名
命令选项:
-n : 一般情况,sed命令会把所有的数据,都输出到屏幕。如果加入此选项,则只会把经过sed命令处理的行,输出到屏幕局。
-e : 允许对输入数据应用多条sed命令编辑。
-i : 用sed修改的结果直接修改读取数据的文件,不从由屏幕输出。即sed可修改文件内容。
命令动作:
a \ : 行后追加。在当前行的行后,添加一行或多行。添加多行,除最后一行外,每行末尾需要用“\”代表数据未完结。【sed '4a choudoufu' score.txt】
c \ : 行替换。用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾都需要用“\”代表数据未完结。【sed '2c No such person!' score.txt】
i \ : 行前插入。在当前行的行前插入一行或多行。插入多行时,除最后一行外,每行末尾都需要用“\”代表数据未完结。【sed '6i Great' score.txt】
d : 删除。删除指定的行。【sed '3d' score.txt】
p : 打印。输出指定的行。
s : 字符替换。用一个字符串替换另外一个字符串,格式为“行范围s/旧字符串/新字符串/g”(和vim编辑操作中的替换格式类似)【sed 's/wangwu/wangshouzhi/g' score.txt】
命令对象:
针对的是行操作。np打印第n行。【sed '2p' score.txt】
示例:
[root@192 cut]# cat score.txt
Id Name Gender Score
1 zhangsan M 90
2 lisi M 88
3 wangwu M 98
4 zhaoliu N 97
5 NangongYi M 100
实例:打印出第2行的数据
[root@192 cut]# sed '2p' score.txt
Id Name Gender Score
1 zhangsan M 90
1 zhangsan M 90
2 lisi M 88
3 wangwu M 98
4 zhaoliu N 97
5 NangongYi M 100
但是,我们发现,除了第2行以外,其他的行业出来了,显然这不是我要的效果。
实例:仅仅打印出第2行的数据
[root@192 cut]# sed -n '2p' score.txt
1 zhangsan M 90
[root@192 cut]#
实例:sed与管道符的操作
不加-n
[root@192 cut]# df -h | sed '2p'
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda3 17G 2.6G 14G 17% /
/dev/sda3 17G 2.6G 14G 17% /
tmpfs 499M 0 499M 0% /dev/shm
/dev/sda1 985M 40M 896M 5% /boot
[root@192 cut]#
加-n
[root@192 cut]# df -h | sed -n '2p'
/dev/sda3 17G 2.6G 14G 17% /
[root@192 cut]#
实例:从文件score.txt获取第1行,删除到第3行的数据,但不修改原文件
[root@192 cut]# sed '1,3d' score.txt
3 wangwu M 98
4 zhaoliu N 97
5 NangongYi M 100
实例:从文件score.txt获取第2行,删除到第4行的数据,但不修改原文件
[root@192 cut]# sed '2,4d' score.txt
Id Name Gender Score
4 zhaoliu N 97
5 NangongYi M 100
[root@192 cut]#
实例:在score.txt文件的第6行后,追加hello LDR
[root@192 cut]# sed '6a hello LDR' score.txt
Id Name Gender Score
1 zhangsan M 90
2 lisi M 88
3 wangwu M 98
4 zhaoliu N 97
5 NangongYi M 100
hello LDR
[root@192 cut]#
实例:在文件score.txt的第2行前插入两行数据
[root@192 cut]# sed '2i hello \
> wold ' score.txt
Id Name Gender Score
hello
wold
1 zhangsan M 90
2 lisi M 88
3 wangwu M 98
4 zhaoliu N 97
5 NangongYi M 100
[root@192 cut]#
注意:这里敲的时候,单引号先写一个,到反斜杠那里回车,才能继续输。切记,单引号前后两部分一起打出然后在反斜杠那里回车,这样,会看不到效果。
实例:把score.txt文件中的“lisi”数据替换为“No such person”(c行替换)
[root@192 cut]# sed '3c No such person!' score.txt
Id Name Gender Score
1 zhangsan M 90
No such person!
3 wangwu M 98
4 zhaoliu N 97
5 NangongYi M 100
[root@192 cut]#
sed 字符串替换 : sed ‘s/旧字符/新字符串/g’ 文件名
实例:把score.txt文件中的“lisi”替换为“liziqiang”
[root@192 cut]# sed 's/lisi/liziqiang/g' score.txt
Id Name Gender Score
1 zhangsan M 90
2 liziqiang M 88
3 wangwu M 98
4 zhaoliu N 97
5 NangongYi M 100
[root@192 cut]#
实例:把score.txt文件中的“lisi”替换为“liziqiang”,并修改原文件
[root@192 cut]# cat score.txt
Id Name Gender Score
1 zhangsan M 90
2 lisi M 88
3 wangwu M 98
4 zhaoliu N 97
5 NangongYi M 100
[root@192 cut]#
[root@192 cut]# sed -i 's/lisi/liziqiang/g' score.txt
[root@192 cut]#
[root@192 cut]# cat score.txt
Id Name Gender Score
1 zhangsan M 90
2 liziqiang M 88
3 wangwu M 98
4 zhaoliu N 97
5 NangongYi M 100
[root@192 cut]#
注意:在实践操作中,不建议使用此种方法,进行文件内容的修改!
实例:(多命令操作)同时把“liziqiang”和“zhaoliu”替换为“#”
[root@192 cut]# sed -e 's/liziqiang/#/g' 's/zhaoliu/#/g' score.txt
sed:无法读取 s/zhaoliu/#/g:没有那个文件或目录
Id Name Gender Score
1 zhangsan M 90
2 # M 88
3 wangwu M 98
4 zhaoliu N 97
5 NangongYi M 100
[root@192 cut]#
这样写,是不对的!多命令应该写到一个单引号里!如下:
[root@192 cut]# sed -e 's/liziqiang/#/g;s/zhaoliu/#/g' score.txt
Id Name Gender Score
1 zhangsan M 90
2 # M 88
3 wangwu M 98
4 # N 97
5 NangongYi M 100
[root@192 cut]#
注意:多命令之间,(单引号中)使用“;”隔开!