sed:字符流编辑器
简介sed是Stream Editor的缩写,简称流编辑器。sed是操作、过滤和转换文本内容的强大工具。常用的功能包括对文件实现快速的增删改查,其中查询的功能最常用是过滤和取行。
说明
sed是Stream Editor的缩写,简称流编辑器。sed是操作、过滤和转换文本内容的强大工具。常用的功能包括对文件实现快速的增删改查,其中查询的功能最常用是过滤和取行。
格式
sed [option] [sed内置命令字符] [file]
常用命令
- -n:取消默认的sed输出,常与sed内置命令的p连用
- -i:直接修改文件内容,而不是输出到终端。如果不使用-i选项,则sed只修改内存中的数据,并不会修改磁盘文件的数据
sed内置命令
- a:append,表示追加文本,去指定的行后面添加一行或多上文本
- d:delete,表示删除匹配行的文本
- i:insert,表示插入文本,在指定行前添加一行货多行文本
- p:print,表示打印匹配行的内容
- s/regexp/replacement/:匹配regexp部分的内容,用replacement替换regexp匹配的内容,regexp部分可以使用正则表达式,在replacement部分可以使用特殊字符&或\1-\9等匹配regexp部分的部分内容。在实时中,s/regexp/replacement/g结尾常与g匹配做全局的替换
示例
准备文件内容
[root@localhost ~]# cat > test2.txt <<EOF
> 1001,python
> 1002,php
> 1003,java
> 1004,golang
> 1005,mysql
> 1006,javascript
> EOF
[root@localhost ~]# cat test2.txt
1001,python
1002,php
1003,java
1004,golang
1005,mysql
1006,javascript
1、在文件指定行后追加文本
[root@localhost ~]# sed "2a 1007,C++" test2.txt
1001,python
1002,php
1007,C++
1003,java
1004,golang
1005,mysql
1006,javascript
sed后面引号里面的内容解析:
- 2:表示对第2行进行操作,其他的行忽略
- a:表示追加,2a表示第2行后面追加文本
- 2a后面一定要加上空格,然后接着输入想要追加的文本内容
2、在文件指定的行前插入文本
[root@localhost ~]# sed "2i 1008,C" test2.txt #2i表示在第二行之前插入文本
1001,python
1008,C
1002,php
1003,java
1004,golang
1005,mysql
1006,javascript
3、在文件指定的行后追加多行文本
[root@localhost ~]# sed "2a 1007,C++\n1008,nodejs" test2.txt #使用\n进行内容换行就可以了
1001,python
1002,php
1007,C++
1008,nodejs
1003,java
1004,golang
1005,mysql
1006,javascript
4、删除文件指定行的内容
[root@localhost ~]# sed "2d" test2.txt #只删除第二行
1001,python
1003,java
1004,golang
1005,mysql
1006,javascript
[root@localhost ~]# sed "2,5d" test2.txt #删除2到5行
1001,python
1006,javascript
5、替换文本内容,使用#和/都可以
[root@localhost ~]# sed "s#a#__#g" test2.txt
1001,python
1002,php
1003,j__v__
1004,gol__ng
1005,mysql
1006,j__v__script
[root@localhost ~]# sed "s/a/__/g" test2.txt
1001,python
1002,php
1003,j__v__
1004,gol__ng
1005,mysql
1006,j__v__script
6、打印输出文件的指定行的内容
[root@localhost ~]# sed '2p' test2.txt
1001,python #默认输出的行
1002,php #p命令输出的行
1002,php #默认输出的行
1003,java #默认输出的行
1004,golang #默认输出的行
1005,mysql #默认输出的行
1006,javascript #默认输出的行
#输出了第二行的内容,但是不只是输出第二行的内容,还输出了其他的内容,这是因为sed命令有一个默认的输出功能,如果要过滤掉多余的内容,就需要使用-n参数取消默认的输出。
[root@localhost ~]# sed -n '2p' test2.txt
1002,php
[root@localhost ~]# sed -n '2,3p' test2.txt
1002,php
1003,java
上面的增删改命令执行后,其实文本的内容都没有发生变化,是因为我们修改的只是内存中的数据,如果需要修改后保存到文件中,就需要使用-i命令
7、将修改后的内容保存到文件中
[root@localhost ~]# sed -i "s/a/__/g" test2.txt #加了-i后就不会直接输出,而是保存到文件
[root@localhost ~]# cat test2.txt
1001,python
1002,php
1003,j__v__
1004,gol__ng
1005,mysql
1006,j__v__script
8、替换例子
[root@localhost ~]# cat test3.txt #奇数行为用户,偶数行尾对应的密码
user1
passwd1
user2
passwd2
user3
passwd3
[root@localhost ~]# sed "N;s/\n/=/g" test3.txt #将用户和密码对应起来
user1=passwd1
user2=passwd2
user3=passwd3
sed内置命令N的作用:不会清空模式空间的内容,并且从输入文件中读取下一行的数据,追加到模式空间中,两行数据以\n连接。
第一行为user1存入模式空间,当有N命令是,读取第二行的内容passwd1,此时模式空间的内容为user1\npasswd1,然后执行s#\n#=#g将\n替换成=。