目录
sed编辑器时一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed 的工作流程主要包括读取、执行和显示三个过程:
模式空间:简单理解就是一个缓冲区,sed从输入流中一行一行的取出内容放到这个缓冲区中按照SCRIPT(脚本)进行处理。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
命令格式
sed -e '操作' 文件1 文件2 ...
sed -n -e '操作' 文件1 文件2 ...
sed -f 简本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...
sed -e 'n{操作1 操作2 ...}'文件1 文件2 ...
| -e | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可以省略,一般执行多个操作命令的时候会使用 |
| -f | 表示用指定的脚本文件来处理输入的文本文件 |
| -h | 显示帮助 |
| -n | 禁止sed编辑器输出,即不自动打印,与p命令一起使用,又恢复自动打印,完成输出 |
| -i | 备份文件文件并原处编辑 |
| -r | 使用扩展正则表达式 |
| s | 替换,替换指定字符 |
| d | 删除,删除选定的行 |
| a | 增加,在当前行下面增加一行指定内容 |
| i | 插入,在选定行上面插入一行指定内容 |
| c | 替换,将选定行替换为指定内容 |
| Y | 字符转换,转换前后的字符长度必须相同 |
| p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容; 如果有非打印字符,则以 AscII码输出。其通常与_n"选项一起使用 |
| = | 打印行号 |
| l(小写L) | 打印数据流中的文本和不可打印的ASCII字符(比如结束符s、制表符\t) |
- //先读取第一行,放入缓冲区,再按照命令处理,p打印
- [root@localhost data]# sed -e 'p' users.txt
- 1,zhangsan
- 1,zhangsan
- 2,lisi
- 2,lisi
- 3,wangwu
- 3,wangwu
- 4,zhaoliu
- 4,zhaoliu
- 5,qianqi
- 5,qianqi
- 6,zhuba
- 6,zhuba
-
- //只有一个操作时,-e可加可不加,不加-n打印两遍
- [root@localhost data]# sed 'p' users.txt
- 1,zhangsan
- 1,zhangsan
- 2,lisi
- 2,lisi
- 3,wangwu
- 3,wangwu
- 4,zhaoliu
- 4,zhaoliu
- 5,qianqi
- 5,qianqi
- 6,zhuba
- 6,zhuba
-
- #查找第二行内容,不加-n,否则会全部输出
- [root@localhost data]# sed -n '2p' passwd
- bin:x:1:1:bin:/bin:/sbin/nologin
-
- #查找第1到3行内容
- [root@localhost data]# sed -n '1,3p' 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
-
- #查看第一行和他后面的三行内容
- [root@localhost data]# sed -n '1,+3p' 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
-
- #查找第38行到最后一行的内容
- [root@localhost data]# sed -n '38,$p' passwd
- postfix:x:89:89::/var/spool/postfix:/sbin/nologin
- sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
- tcpdump:x:72:72::/:/sbin/nologin
- zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
- apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
- [root@localhost data]#
-
- #显示1-5行
- [root@localhost data]# sed -e '5q' 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
-
- #打印行号,不打印内容
- [root@localhost data]# sed -n '=' users.txt
- 1
- 2
- 3
- 4
- 5
- 6
-
- #显示非打印字符
- [root@localhost data]# sed -n 'l' users.txt
- 1,zhangsan$
- 2,lisi$
- 3,wangwu$
- 4,zhaoliu$
- 5,qianqi$
- 6,zhuba$
-
- #同时处理多条操作
- [root@localhost data]# sed -n -e '=' -e 'p' users.txt
- 1
- 1,zhangsan
- 2
- 2,lisi
- 3
- 3,wangwu
- 4
- 4,zhaoliu
- 5
- 5,qianqi
- 6
- 6,zhuba
- [root@localhost data]# sed -n -e '=;p' users.txt
- 1
- 1,zhangsan
- 2
- 2,lisi
- 3
- 3,wangwu
- 4
- 4,zhaoliu
- 5
- 5,qianqi
- 6
- 6,zhuba
- [root@localhost data]# sed -n '
- > =
- > p
- > ' users.txt
- 1
- 1,zhangsan
- 2
- 2,lisi
- 3
- 3,wangwu
- 4
- 4,zhaoliu
- 5
- 5,qianqi
- 6
- 6,zhuba
-
-
- #查找含有root的行
- [root@localhost data]# sed -n '/root/p' passwd
- root:x:0:0:root:/root:/bin/bash
- operator:x:11:0:operator:/root:/sbin/nologin
- [root@localhost data]#
-
- #查找包含bash或者root的行
- [root@localhost data]# sed -nr '/bash|root/p' passwd
- root:x:0:0:root:/root:/bin/bash
- operator:x:11:0:operator:/root:/sbin/nologin
- zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
-
- #查找数字出现三次的行,使用扩展正则需要加上-r参数
- [root@localhost data]# sed -n '/[0-9]{3}/p' passwd
- [root@localhost data]# sed -nr '/[0-9]{3}/p' passwd
- games:x:12:100:games:/usr/games:/sbin/nologin
- systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
- polkitd:x:999:997:User for polkitd:/:/sbin/nologin
- abrt:x:173:173::/etc/abrt:/sbin/nologin

实现一次性执行多条命令
在' '中使用; 即' ; '
-e ' A ' -e ' B '文件
-e '
A
B
' 文件

sed 'xq' 文件

打印一行内容
sed -n 'xp' 文件 (x代表行号)
打印行号区间
sed -n '1,4' testfile.sh
sed -n '1,+3p' testfile.sh 显示第一行之后连续三行内容,,,效果等同于1,4


n的作用移动到下一行





r
sed '指定行范围a 指定内容' 文件名
在指定第二行下增加内容

sed '指定行范围i 指定内容' 文件名
在指定第二行上增加内容

sed '指定行范围c 指定内容' 文件名
替换第三行内容

指定第3到4行替换为指定行内容(多行变为一行)

指定包含e的行替换为指定行内容

删除所有行
sed 'd' 文件
删除指定行
sed '1d' 文件
删除指定的多行
sed '2,8d' 文件
删除以s开头
sed '/^s/d' 文件
删除以en结尾
sed '/en$/d' 文件
删除除了en结尾的行
sed '/en$/!' 文件
删除空行
sed '/^$/d' 文件
sed -n '/^$/!p' 文件
删除包含2的行删除到第一个包含3的行,,,这里/2/看作一个字符串(如果后面还有2开头的会继续重复执行,,如果没有3开头会一直删到结尾)
sed '/2/,/3/d' 文件
与正则表达式一起使用
删除结尾为bash或nologin的行
sed -r '/bash$|nologin$/d' /etc/passwd
从包含第1个字符串的行开始删除,到包含第2个字符串的位置停止删除
如果找不到第2个字符串的行,则删到最后一行
sed '/one/,/six/d' file1
删除1-3的行

格式
sed [选项] '行范围 s/旧字符串/新字符串/替换标记' 文件名
4种替换标记: .
- 数字:表明新字符串将替换第几处匹配的地方
- g:表明新字符串将会替换所有匹配的地方
- p:打印与替换命令匹配的行,与-n- 起使用
- 文件:将替换的结果写到文件中
//两个并一起代表空格
,,,删除空格
开头的空格用#代替
加 -i才能对文件进行修改
sed -i '/swap/ s/^/#/' /etc/swap
不加范围,替换每行查找到的字符串
sed -n 's/root/admin/p' /etc/passwd
(swapoff -a 关闭swap 临时关闭 /etc/rc.d/rc.local 里面添加swapoff -a 添加权限+x /etc/fstab永久关闭)
-
- //root替换为admin,不加g和数字,默认替换每行第一个匹配到的root
- [root@localhost data]# sed -n 's/root/admin/p' passwd
- admin:x:0:0:root:/root:/bin/bash
- operator:x:11:0:operator:/admin:/sbin/nologin
-
- //加数字2,替换每行匹配到的第二个root
- [root@localhost data]# sed -n 's/root/admin/2p' passwd
- root:x:0:0:admin:/root:/bin/bash
-
- //加g则是全部替换
- [root@localhost data]# sed -n 's/root/admin/gp' passwd
-
-
- //删除前面的所有0
- [root@localhost data]# echo 000000001010|sed 's/^0*//'
- 1010
-
-
- //给1-3行加上注释
- [root@localhost data]# sed '1,10 s/^/#/' 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
-
-
- //将所有root开头的行注释
- [root@localhost data]# sed -n 's/^root/#root/p' passwd
- #root:x:0:0:root:/root:/bin/bash
- [root@localhost data]# sed -n '/^root/ s/^/#/p' passwd
- #root:x:0:0:root:/root:/bin/bash
-
- //注释fstab文件中的swap行
- [root@localhost data]# sed -n '/swap/ s/^/#/p' /etc/fstab
- #/dev/mapper/centos-swap swap swap defaults 0 0
- [root@localhost data]# sed -n 's/.*swap.*/#&/p' /etc/fstab
- #/dev/mapper/centos-swap swap swap defaults 0 0
- [root@localhost data]#
-
- sed '1,4{H;d};$G' t2 //H复制 d删除(即为剪切) G粘贴, $最后一行
-
sed中,使用\u表示大写,\l表示小写
1. 把每个单词的第一个小写字母变大写:
sed 's/\b[a-z]/\u&/g' filename
2. 把所有小写变大写:
sed 's/[a-z]/\u&/g' filename
3. 大写变小写:
sed 's/[A-Z]/\l&/g' filename


修改之后再保存

替换的符号

两个文件合并
vim编辑器末行模式中 r加上要合并的文件
或者下图
或者cat命令
或者paste命令

互换位置


