sed 流编辑器

sed  strem editor 流编辑器

       sed编辑器是一行一行的处理文件内容的。正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的修改。

       接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;

sed也是支持正则表达式的,如果要使用扩展正则加参数-r

sed的执行过程:

1、  一次读取一行数据

2、  根据我们提供的规则来匹配相关的数据,比如查找root。

3、  按照命令修改数据流中的数据,比如替换

4、  将结果进行输出

5、  重复上面四步

如何使用

语法格式:sed  [options] ‘[commands]’ filename

例1:

[root@xuegod63 ~]# echo "this is aplle" | sed 's/aplle/dog/'
this is dog
[root@xuegod63 ~]# echo "this is aplle" > a.txt
[root@xuegod63 ~]# sed 's/apple/dog/' a.txt
this is aplle
[root@xuegod63 ~]# cat a.txt  #发现并没有修改文件
this is aplle

sed选项|参数

options:

       -a    在当前行下面插入文件

        -n     读取下一个输入行,用下一个命令处理新的行而不是用第一个命令

       -e    执行多个sed指令

       -f    运行脚本

       -i     编辑文件内容 ***

       -i.bak     编辑的同时创造.bak的备份

       -r    使用扩展的正则表达式

 

命令:

       i      在当前行上面插入文件

       c     把选定的行改为新的指定的文本

       p     打印 ***

       d     删除 ***

       r/R  读取文件/一行

       w    另存

       s      查找

       y     替换

       h     拷贝模板块的内容到内存中的缓冲区。

       H     追加模板块的内容到内存中的缓冲区。

       g     获得内存缓冲区的内容,并替代当前模板块中的文本。

       G     获得内存缓冲区的内容,并追加到当前模板块文本的后面    

       D     删除\n之前的内容

       P     打印\n之前的内容

 

替换标记

  • 数字:表明新文本将替换第几处模式匹配的地方

  • g:表示新文本将会替换所有匹配的文本

  •  \1:子串匹配标记,前面搜索可以用元字符集\(..\),

  • &:保留搜索到的字符用来替换其它字符

 

sed匹配字符集

^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。

$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。

. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。

* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。

 

例1:s 只替换第一个匹配到的字符,将passwd中的root用户替换成xuegod

#  sed 's/root/xuegod/'   /etc/passwd
xuegod:x:0:0:root:/root:/bin/bash  #发现只替换了第一个匹配的root,后面的没有替换
bin:x:1:1:bin:/bin:/sbin/nologin

例2:全面替换标记g

#  sed 's/root/xuegod/g'   /etc/passwd  |more
xuegod:x:0:0:xuegod:/xuegod:/bin/bash    #全部替换了

例2: 将sed中默认的/ 定界符改成#号

[root@xuegod63 ~]# sed 's#/bin/bash#/sbin/nologin#' /etc/passwd  | more
root:x:0:0:root:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
以/来做定界符:
[root@xuegod63 ~]# sed 's/\/bin\/bash/\/sbin\/nologin/' /etc/passwd

(2)按行查找替换

写法如下:

  • 用数字表示行范围;$表示行尾

  • 用文本模式配置来过滤

例1:单行替换,将第2行中bin替换成xuegod

[root@xuegod63 ~]# sed '2s/bin/xuegod/' /etc/passwd  | more

root:x:0:0:root:/root:/bin/bash
xuegod:x:1:1:bin:/bin:/sbin/nologin

例2:多行替换,如果涉及到多行处理,用逗号表示行间隔。 将第3行到最行尾中bin替换成xuegod

[root@xuegod63 ~]# sed '2,$s/bin/xuegod/' /etc/passwd  | more

root:x:0:0:root:/root:/bin/bash
xuegod:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sxuegod:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sxuegod/nologin

(3)d  删除

第2行到第4行的内容

[root@xuegod63 ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63   xuegod63.cn
192.168.1.64   xuegod64.cn
192.168.1.62   xuegod62.cn

[root@xuegod63 ~]#  sed '2,4d' /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.62   xuegod62.cn

[root@xuegod63 ~]# sed '/192.168/d' /etc/hosts  #将包括192.168的行删除

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

(4)添加行

  • 命令i(insert插入),在当前行前面插入一行  i\

  • 命令a(append附加),在当前行后面添加一行 a\

例1:插入

[root@xuegod63 ~]# echo "hello world" | sed  'i\ xuegod '
xuegod
hello world

例2:追加

[root@xuegod63 ~]#  echo "hello world"|sed 'a\xuegod'
hello world
xuegod

例3:在文件最后追加内容

[root@xuegod63 ~]#   sed '$a\192.168.1.65 xuegod65.cn'   /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63   xuegod63.cn
192.168.1.64   xuegod64.cn
192.168.1.62   xuegod62.cn
192.168.1.65 xuegod65.cn

例4:在文件中第2行之后,开始追加内容

[root@xuegod63 ~]#   sed '2a\192.168.1.65 xuegod65.cn'   /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.65 xuegod65.cn
192.168.1.63   xuegod63.cn
192.168.1.64   xuegod64.cn
192.168.1.62   xuegod62.cn

例5:在文件中第2行到第4行之后分别追加内容

[root@xuegod63 ~]#  sed '2,4a\hello world' word1.txt

[root@xuegod63 ~]#   sed '2,4a\192.168.1.65 xuegod65.cn'   /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.65 xuegod65.cn
192.168.1.63   xuegod63.cn
192.168.1.65 xuegod65.cn
192.168.1.64   xuegod64.cn
192.168.1.65 xuegod65.cn
192.168.1.62   xuegod62.cn

(5)修改行命令c (change) c\

例1:将第4行内容改成192.168.1.65 xuegod65.cn

[root@xuegod63 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63   xuegod63.cn
192.168.1.64   xuegod64.cn
192.168.1.62   xuegod62.cn

[root@xuegod63 ~]#   sed '4c\192.168.1.65 xuegod65.cn'  /etc/hosts

 

例2:将第2行到最后全部修改成192.168.1.65 xuegod65.cn

[root@xuegod63 ~]#   sed '2,$c\192.168.1.65 xuegod65.cn'  /etc/hosts 

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.65 xuegod65.cn

 

例3:将包括192.168.1.64行的内容修改成192.168.1.65

[root@xuegod63 ~]# sed '/192.168.1.64/c\192.168.1.65' /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63   xuegod63.cn
192.168.1.65
192.168.1.62   xuegod62.cn

(6)打印,直接输入文件中的内容

例1:输入第2行内容

[root@xuegod63 ~]# sed -n '2p' /etc/hosts

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

 

(7)将修改或过滤出来的内容保存到另一个文件中

例2:将passwd中的包括root字样的行保存到 c.txt 中

[root@xuegod63 ~]# sed -n '/root/w c.txt' /etc/passwd

 

[root@xuegod63 ~]# cat c.txt

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

 

(8)-i 对原文件修改,保存( 必会 )   使用场景: 替换或修改服务器配置文件

[root@xuegod63 ~]# cp /etc/passwd /opt/

[root@xuegod63 ~]# sed -i 's/root/xuegod/'  /etc/passwd

[root@xuegod63 ~]# head -n 1 /etc/passwd

xuegod:x:0:0:root:/root:/bin/bash

 

修改IP地址为192.168.1.65

[root@xuegod63 ~]# sed -i 's/IPADDR=192.168.1.63/IPADDR=192.168.1.65/' /etc/sysconfig/network-scripts/ifcfg-ens33

 

版权声明:
作者:WaterBear
链接:https://l-t.top/1660.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>