地址决定用哪些进行编辑。地址形式可以是数字、正则表达式或二者的结合。如果没有指定地址,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对指定行进行何种操作,包括打印、删除、修改等。
======================================= P D S==============================================
选项:
-n :只显示被修改的行的内容
-e :直接在命令列模式上进行 sed 的动作编辑;允许多项编辑
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
动作(命令):
a :在指定行后 新增一行或多行内容
c :替换指定行的内容
d :删除指定行的内容
i :在指定行之前 插入一行或多行内容
I : 列出非打印字符
p : 打印模式空间的行
有些特殊用法的实例:
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 的模式空间和暂存空间
模式空间里面默认有换行符号。
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 还有一些不是经常使用的,我这就不敲例子了,看看即可。
下面 sed 中使用外部变量的画横线的是错误用法
20200221