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对指定行进行何种操作,包括打印、删除、修改等。

======================================= P  D  S==============================================

选项:
-n :只显示被修改的行的内容
-e :直接在命令列模式上进行 sed 的动作编辑;允许多项编辑
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

动作(命令):
a :在指定行后 新增一行或多行内容
c :替换指定行的内容
d :删除指定行的内容
i :在指定行之前 插入一行或多行内容

I : 列出非打印字符

p :   打印模式空间的行

Shell学习15天(流编辑器sed详解)- 10day_第1张图片

有些特殊用法的实例:

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  是一个概念。

其实就是  选项  定址和命令

========================================  R  W  A  I  C ================================================

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.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost 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]$ 

 

===================================    n  h 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_第2张图片

模式空间里面默认有换行符号。

1. 其中g h  是覆盖,G H 是追加

2. 实例:

2.1   sed -r 'G;G'  passwd     ##passwd变成每行后面两行空行

2.2  sed  -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.3  sed  -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/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]$ 

2.5  还有一些不是经常使用的,我这就不敲例子了,看看即可。

Shell学习15天(流编辑器sed详解)- 10day_第3张图片

下面 sed 中使用外部变量的画横线的是错误用法

Shell学习15天(流编辑器sed详解)- 10day_第4张图片

Shell学习15天(流编辑器sed详解)- 10day_第5张图片

Shell学习15天(流编辑器sed详解)- 10day_第6张图片

Shell学习15天(流编辑器sed详解)- 10day_第7张图片

 

20200221

你可能感兴趣的:(shell)