【现学现忘&Shell编程】— 35.sed命令(一)
1、sed命令说明
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
选项才会直接修改文件。
小说明:
vim可以直接修改文件内容,我们使用的也非常多,为什么还要学
sed
命令呢?因为vim需要我们手动和计算机交互,需要手动输入一些编辑指令,保存指令,切换模式指令等,才能完成vim的编辑操作。
在Shell中很难做到人机交互,所以vim操作没有办法在Shell程序使用,因此要通过
sed
命令来完成,这是Shell中修改文件内容最最最主要的方式。
2、行数据操作
使用如下文本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
就可以了。
(3)向文件中追加数据
需求:在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