sed高级命令

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 命令。每次循环读取数据过程中,模式空间的内容都会被清空,然而保持空间的内容则保持不变,不会在循环中被删除。
名称缩写作用
getg将保持空间的内容拷贝到模式空间中,原模式空间将被清零。
获取G将保持空间的内容追加到模式空间\n之后
holdh将模式空间的内容拷贝到保持空间中,原保持空间将被清零。
拥有H将模式空间的内容追加到保持空间\n之后。
deleted删除模式空间中的所有行,并读入下一行。
删除D删除模式空间的第一行,不读入下一行。
exchangx交换内容
nextn读取下一行到模式空间。
下一个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则将模式空间内容全部打印出来
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值