sed:字符流编辑器

xiaohai 2021-07-31 21:26:48 2401人围观 标签: Linux 
简介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替换成=。