文章目录
1. sed的作用
sed是Stream Editor(流编辑器)的缩写,简称流编辑器;用来处理文件的.
- 首先sed读取文件中的一行内容,把其保存在一个临时缓存区中(也称为模式空间),然后根据需求处理临时缓冲区中的行,完成后把该行发送到屏幕上
- 由于sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会直接修改原文件
- Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作,对文件进行过滤和转换操作
2. sed使用方法介绍
sed常见的语法格式有两种:
- 命令行模式
- 脚本模式
命令行格式
sed [options] ‘处理动作’ 文件名
常用选项
选项 | 说明 |
---|---|
-e | 进行多项(多次)编辑 |
-n | 取消默认输出 |
-r | 使用扩展正则表达式 |
-i | 修改源文件 |
-f | 指定sed脚本的文件名 |
常见处理动作
动作 | 说明 |
---|---|
‘p’ | 打印 |
‘i’ | 在指定行之前插入内容 |
‘a’ | 在指定行之后插入内容 |
‘c’ | 替换指定行所有内容 |
‘d’ | 删除指定行 |
3. 示例
样本
[root@localhost ~]# 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
hello
hello123
处理动作
p 打印
[root@localhost ~]# sed -n p 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
hello
hello123
[root@localhost ~]# sed p passwd //不取消默认输出,由于sed是一行一行读取的所以会成对的出现
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
password: 123
1234598236
1234598236
thinkyou
thinkyou
hello
hello
hello123
hello123
[root@localhost ~]# sed -n '1p' passwd //打印第1行
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# sed -n '5p' passwd //打印第5行
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# sed -n '3p' passwd //打印第3行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]# sed -n '1,5p' passwd //打印第1-5行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# sed -n '$p' passwd //打印最后1行
hello123
i 在指定行之前插入内容
//文件最后行的上面增加内容
[root@localhost ~]# sed '$i999' 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
hello
999
hello123
//文件实际上是没有改变的
[root@localhost ~]# 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
hello
hello123
//加-i才会编辑源文件
[root@localhost ~]# sed -i '$i999' passwd
[root@localhost ~]# 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
hello
999
hello123
//在每一行上面添加内容
[root@localhost ~]# sed 'i888' passwd
888
root:x:0:0:root:/root:/bin/bash
888
bin:x:1:1:bin:/bin:/sbin/nologin
888
daemon:x:2:2:daemon:/sbin:/sbin/nologin
888
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
888
operator:x:11:0:operator:/root:/sbin/nologin
888
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
888
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
888
apache:x:993:991::/home/apache:/sbin/nologin
888
mysql:x:992:990::/home/mysql:/sbin/nologin
888
password: 123
888
1234598236
888
thinkyou
888
hello
888
999
888
hello123
//在第3行之前,也就是第2行之后插入内容
[root@localhost ~]# sed '3i888' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
888
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
hello
999
hello123
//匹配think然后在他之前添加内容
[root@localhost ~]# sed '/^think/i888' 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
888
thinkyou
hello
999
hello123
a 在指定行之后插入内容
//匹配think然后在他之后添加内容
[root@localhost ~]# sed '/^think/a777' 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
777
hello
999
hello123
//每行之后加上777
[root@localhost ~]# sed 'a777' passwd
root:x:0:0:root:/root:/bin/bash
777
bin:x:1:1:bin:/bin:/sbin/nologin
777
daemon:x:2:2:daemon:/sbin:/sbin/nologin
777
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
777
operator:x:11:0:operator:/root:/sbin/nologin
777
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
777
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
777
apache:x:993:991::/home/apache:/sbin/nologin
777
mysql:x:992:990::/home/mysql:/sbin/nologin
777
password: 123
777
1234598236
777
thinkyou
777
hello
777
999
777
hello123
777
//第2行之后加上777
[root@localhost ~]# sed '2a777' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
777
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
hello
999
hello123
c 替换指定行所有内容
//全部替换为666
[root@localhost ~]# sed 'c666' passwd
666
666
666
666
666
666
666
666
666
666
666
666
666
666
666
//替换第5行
[root@localhost ~]# sed '5c666' 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
666
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
hello
999
hello123
//替换文件1到5号内容为666
[root@localhost ~]# sed '1,5c666' passwd
666
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
hello
999
hello123
//替换think开头的行
[root@localhost ~]# sed '/^think/c666' 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
666
hello
999
hello123
d 删除文件内容
//删除文件第1行
[root@localhost ~]# sed '1d' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
hello
999
hello123
//删除文件1-5行
[root@localhost ~]# sed '1,5d' passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
hello
999
hello123
//删除文件最后一行
[root@localhost ~]# sed '$d' 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
apache:x:993:991::/home/apache:/sbin/nologin
mysql:x:992:990::/home/mysql:/sbin/nologin
password: 123
1234598236
thinkyou
hello
999
对文件进行搜索替换操作
语法:sed + 选项 's/搜索的内容/替换的内容/动作' + 需要处理的文件
- s表示search搜索
- 斜杠/表示分隔符,可以自定义
- 动作一般是打印p和全局替换g(默认只替换每行第一个匹配到的内容)
//给文件的1-5行加上注释并打印出来
[root@localhost ~]# sed -n '1,5s/^/#/gp' 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
#mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#operator:x:11:0:operator:/root:/sbin/nologin
//给每行加上注释
[root@localhost ~]# sed -n s/^/#/pg 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
#mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#operator:x:11:0:operator:/root:/sbin/nologin
#ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
#nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
#apache:x:993:991::/home/apache:/sbin/nologin
#mysql:x:992:990::/home/mysql:/sbin/nologin
#password: 123
#1234598236
#thinkyou
#hello
#999
#hello123
//用@当分隔符替换/bin为#
[root@localhost ~]# sed -n s@/bin@#@pg passwd
root:x:0:0:root:/root:#/bash
bin:x:1:1:bin:#:/sbin/nologin
2. sed 多行命令
普通或者说基础的sed命令都只是针对单行数据执行操作,在 sed 命令读取缓冲区(模式空间)中的文本数据时,它会基于换行符的位置,将数据分成行,一次处理一行数据。
有时我们需要对跨多行的数据执行特定操作,如果用普通的sed命令则无法匹配,由此我们需要引入两个概念。
1.1 保持空间与模式空间
- 模式空间:模式空间用于 sed 执行的正常流程中。该空间 sed 内置的一个缓冲区,用来存放、修改从输入文件读取的内容。
- 保持空间:保持空间是另外一个缓冲区,存放模式空间的临时数据。Sed 可以在保持空间和模式空间交换数据,但是不能在保持空间上执行普通的 sed 命令。每次循环读取数据过程中,模式空间的内容都会被清空,然而保持空间的内容则保持不变,不会在循环中被删除。
名称 | 缩写 | 作用 |
---|---|---|
get | g | 将保持空间的内容拷贝到模式空间中,原模式空间将被清零。 |
获取 | G | 将保持空间的内容追加到模式空间\n之后 |
hold | h | 将模式空间的内容拷贝到保持空间中,原保持空间将被清零。 |
拥有 | H | 将模式空间的内容追加到保持空间\n之后。 |
delete | d | 删除模式空间中的所有行,并读入下一行。 |
删除 | D | 删除模式空间的第一行,不读入下一行。 |
exchang | x | 交换内容 |
next | n | 读取下一行到模式空间。 |
下一个 | N | 将下一行追加到模式空间后。 |
[root@localhost ~]# cat test
than
k you
[root@localhost ~]# sed -n 'N;s/\n// p' test
thank you
不加N不会读取第二行也就是k you,加上后两行变为一行,再将中间的换行符取消后得到这个结果
[root@localhost ~]# cat test
t
thhan
thank
1
thankyou
[root@localhost ~]# sed 'N;/thank/D' test
t
thhan
thankyou
[root@localhost ~]# sed 'N;/thank/D' test
t
thhan
2
3
[root@localhost ~]# cat test
t
thhan
thank
1
thank
2
3
读取一行,N 追加下一行,不匹配,继续读直到匹配,删除匹配行(连带换行符),依次类推,有匹配就删除第一行,不匹配就继续循环。
[root@localhost ~]# sed '2h;h' test
1
2
thank
4
5
[root@localhost ~]# sed '3h;g' test
thank
thank
thank
h先将模式空间内容覆盖过去,g将保持空间覆盖到模式空间
[root@localhost ~]# sed '1h;x' test
1
1
2
thank
4
x将保持空间内容交换到模式空间
[root@localhost ~]# sed '3h;G' test
1
2
thank
thank
4
thank
5
thank
G则是追加
[root@localhost ~]# sed 'h' test
1
2
thank
4
5
[root@localhost ~]# sed '1h;g' test
1
1
1
1
1
将模式空间覆盖到保持空间,g在将保持空间覆盖到模式空间
[root@localhost ~]# sed 'N;p' test
1
2
1
2
thank
4
thank
4
5
[root@localhost ~]# sed 'N;P' test
1
1
2
thank
thank
4
5
P打印多行组中的第一行,b则将模式空间内容全部打印出来