Shell学习15天(流编辑器sed详解)- 10day

(一) sed 定址(地址)
地址决定用哪些进行编辑。地址形式可以是数字、正则表达式或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。
sed -r 'd'passwd删除所有行
sed -r '3d' passwd删除第三行
sed -r '1,3d'passwd删除1-3行
sed -r '/root/,5d'passwd删除从root行开始到行号为5的行
sed-r'/^bin/,+5d'passwd删除从bin开头的行以及他后面的再删除5行一共删除6行
sed -r '/root/!d'passwd除了root行以外都删除
sed -r 's/root/alice/g'paswd全局替换root为alice
sed -r '1~2d'passwd删除所有的奇数行从1行开始,每隔2行删除一次
sed -r '0~2d'passwd删除所有的偶数行从0开始,每隔2行删除一次

[hujianmei@localhost days_10]$ cat passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [hujianmei@localhost days_10]$ 数字定址^C [hujianmei@localhost days_10]$ sed -r 'd' passwd [hujianmei@localhost days_10]$ sed -r '3d' passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [hujianmei@localhost days_10]$ sed -r '1,3d' passwd adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [hujianmei@localhost days_10]$ 正则表达式定址^C [hujianmei@localhost days_10]$ 删除root行^C [hujianmei@localhost days_10]$ sed -r '/root/d' passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin [hujianmei@localhost days_10]$ 删除root行开始,到第五行^C [hujianmei@localhost days_10]$ sed -r '/^root/,5d' passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [hujianmei@localhost days_10]$ 全局替换root为alice^C [hujianmei@localhost days_10]$ sed -r 's/root/alice/g' passwd alice:x:0:0:alice:/alice:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/alice:/sbin/nologin [hujianmei@localhost days_10]$

(二) sed命令
sed命令告诉sed对指定行进行何种操作,包括打印、删除、修改等。
======================================= PDS==============================================
选项:
-n :只显示被修改的行的内容
-e :直接在命令列模式上进行 sed 的动作编辑;允许多项编辑
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
动作(命令):
a :在指定行后 新增一行或多行内容
c :替换指定行的内容
d :删除指定行的内容
i :在指定行之前 插入一行或多行内容
I : 列出非打印字符
p :打印模式空间的行
Shell学习15天(流编辑器sed详解)- 10day
文章图片

有些特殊用法的实例:
sed-r‘3{h; d}’ passwd##把第三行保存在暂存缓冲区再删除{}在这里就是shell元字符,表示命令集合
sed-r'1,5s/(.*)/#\1/'passwd##查询范围1-5行,把1-5行按s标志进行替换。这里是给1-5行加注释
sed -r '/root/s/^/#/'passwd##查询root行,把含root的行的行首替换为# .。这里也是给含root的行加注释
sed-r's/(.)(.)(.*)/\1#\2\3/'passwd###给每行第二个字母前面加#
sed -r 's/(.*)(.)(.)/\1\2#\3/'passwd###给每行倒数第二个字母后加#
其实上面红色字体写法就是 定址加动作啊。只不过这个动作是s开头的替换标识动作。和 /root/d是一个概念。
其实就是选项定址和命令
========================================RWAIC ================================================
sed-r'/lp/r/etc/hosts'passwd####把hosts文件内容追加到passwd的含lp行后面:
[hujianmei@localhost days_10]$ sed -r '/lp/r/etc/hosts'passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 127.0.0.1localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1localhost localhost.localdomain localhost6 localhost6.localdomain6 sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [hujianmei@localhost days_10]$

sed -r'/root/w /tmp/1.txt' passwd##把passwd中含root的保存到/tmp/1.txt文件
[hujianmei@localhost days_10]$ sed -r '/root/w /tmp/1.txt' passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [hujianmei@localhost days_10]$ cat /tmp/1.txt root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [hujianmei@localhost days_10]$

sed-r'2a1111' passwd##再第二行后面加入1111这一行
[hujianmei@localhost days_10]$ sed -r'2a1111'passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin 1111 daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [hujianmei@localhost days_10]$

sed-r'2i1111'passwd###在第而行前面加入1111这一行
[hujianmei@localhost days_10]$ sed-r'2i1111'passwd root:x:0:0:root:/root:/bin/bash 1111 bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin 、[hujianmei@localhost days_10]$

sed-r'2c1111'passwd##把第二行给替换成1111
[hujianmei@localhost days_10]$ sed-r'2c1111'passwd root:x:0:0:root:/root:/bin/bash 1111 daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [hujianmei@localhost days_10]$


===================================nh H g G ==================================================
sed-r'/eastern/{n; d}'passwd## n (next)获取下一行找到含 eastern内容的行,删除它的下一行
sed-r'/eastern/{n; n; s/AM/Archile/}'passwd### 替换含eastern行的下两行中AM为Archile
-- -- sed的模式空间和暂存空间
Shell学习15天(流编辑器sed详解)- 10day
文章图片

模式空间里面默认有换行符号。
1. 其中g h是覆盖,G H 是追加
2. 实例:
2.1sed -r 'G; G'passwd##passwd变成每行后面两行空行
2.2sed-r '1h; $G' passwd##第一行暂存在暂存空间,最后一行的时候把暂存空间内容追加方式取出来。也就是复制了第一行到最后一行。
[hujianmei@localhost days_10]$ sed-r '1h; $G' passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin root:x:0:0:root:/root:/bin/bash [hujianmei@localhost days_10]$

2.3sed-r'1h; 2,$g'passwd##2行到最后一行都变成第一行
2.4 sed -r'1h; 2,3H; $G 'passwd##第一行先覆盖暂存空间,这样可以覆盖掉里面原本的空行,再把2、3行追加过去,最后一行的时候取出来追加到passwd末尾。如用sed-r'1,3H; $G'最后三行和文件末尾会有一个空格
[hujianmei@localhost days_10]$ sed -r'1h; 2,3H; $G 'passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [hujianmei@localhost days_10]$ sed -r'1,3H; $G 'passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologinroot:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [hujianmei@localhost days_10]$

2.5还有一些不是经常使用的,我这就不敲例子了,看看即可。
Shell学习15天(流编辑器sed详解)- 10day
文章图片

下面 sed 中使用外部变量的画横线的是错误用法
Shell学习15天(流编辑器sed详解)- 10day
文章图片

Shell学习15天(流编辑器sed详解)- 10day
文章图片

Shell学习15天(流编辑器sed详解)- 10day
文章图片

Shell学习15天(流编辑器sed详解)- 10day
文章图片


【Shell学习15天(流编辑器sed详解)- 10day】20200221

    推荐阅读