sed

sed介绍

1.sed介绍:

sed是Stream Editor(流编辑器的缩写),简称流编辑器,是用来处理稳健的。

2.sed处理文件方式:

sed是一行一行处理文件内容并按照要求进行处理,把处理后的结果输出到屏幕。

(1).首先sed读取文件中的一行内容,把其保存在一个 缓冲区中(也称模式空间)

(2).然后根据需求处理临时缓冲区中的行,完成后把该行发到屏幕上

注意:sed是对缓冲区中的副本进行编辑,不会直接修改源文件

sed使用方法

一、命令行格式

语法格式

语法1:sed [options] '处理动作' 文件名

语法2:sed [options] '/正则表达式/动作' 文件名

常用选项

选项说明备注
-e进行多项(多次)编辑
-n取消静默输出不自动打印模式空间
-r使用扩展正则表达式
-i原地编辑(修改源文件)
-f指定sed脚本的文件名

常见处理动作

注意:所有动作都要写在单引号里

动作说明
p打印
i在指定行之前插入内容
a在指定行之后插入内容
c替换指定行所有内容
d删除指定行

举例:

有a.txt文件如下
[root@master shell]# cat -n a.txt
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

1、打印文件内容

[root@master shell]# sed -n 'p' a.txt			打印每一行,取消静默输出
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@master shell]# sed -n '2p' a.txt			打印第2行
bin:x:1:1:bin:/bin:/sbin/nologin

[root@master shell]# sed -n '1,3p' a.txt		打印1到3行
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@master shell]# sed -n '$p' a.txt			打印最后一行
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

2、增加文件内容

[root@master shell]# sed 'i11111' a.txt			文件每行上一行增加内容
11111
root:x:0:0:root:/root:/bin/bash
11111
bin:x:1:1:bin:/bin:/sbin/nologin
11111
daemon:x:2:2:daemon:/sbin:/sbin/nologin
11111
adm:x:3:4:adm:/var/adm:/sbin/nologin
11111
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@master shell]# sed '2i11111' a.txt		文件第二行上一行增加内容
root:x:0:0:root:/root:/bin/bash
11111
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@master shell]# sed 'a11111' a.txt			文件每行下一行增加内容
root:x:0:0:root:/root:/bin/bash
11111
bin:x:1:1:bin:/bin:/sbin/nologin
11111
daemon:x:2:2:daemon:/sbin:/sbin/nologin
11111
adm:x:3:4:adm:/var/adm:/sbin/nologin
11111
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
11111

[root@master shell]# sed '2a11111' a.txt		文件第2行的下一行增加内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
11111
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@master shell]# sed '1,3a11111' a.txt		文件第1到3行的下一行增加内容
root:x:0:0:root:/root:/bin/bash
11111
bin:x:1:1:bin:/bin:/sbin/nologin
11111
daemon:x:2:2:daemon:/sbin:/sbin/nologin
11111
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@master shell]# sed '/^root/ahello root' a.txt		文件以root开头的行增加内容
root:x:0:0:root:/root:/bin/bash
hello root
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

3、修改文件内容

[root@master shell]# sed 'chello world' a.txt			文件的每一行修改为hello world
hello world
hello world
hello world
hello world
hello world

[root@master shell]# sed '2chello world' a.txt			文件第2行修改为hello world
root:x:0:0:root:/root:/bin/bash
hello world
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@master shell]# sed '1,3chello world' a.txt		文件1到3行的内容修改为hello world
hello world
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

4、删除文件内容

[root@master shell]# sed '2d' a.txt						删除文件第2行
root:x:0:0:root:/root:/bin/bash
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@master shell]# sed '1,3d' a.txt					删除文件1到3行
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

5、搜索替换文件内容

语法:sed 选项 's/搜索的内容/替换的内容/动作' 文件名

其中,s表示search搜索,斜杠/表示分隔符,可以自己定义;动作一般是打印p和全局替换g

[root@master shell]# sed -n 's/root/ROOT/p' a.txt		不加g,则只替换每一行的第一处符合内容
ROOT:x:0:0:root:/root:/bin/bash

[root@master shell]# sed -n 's/root/ROOT/gp' a.txt		加g,则替换每一行的所有符合内容
ROOT:x:0:0:ROOT:/ROOT:/bin/bash

[root@master shell]# sed -n 's/^#//pg' a.txt			将文件中开头的#去掉	

[root@master shell]# sed -n '1,3s/^/#/p' a.txt			将文件1到3行开头加上#
#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@master shell]# sed -n 's/^bin/#/p' a.txt			将以bin开头的位置替换为#
#:x:1:1:bin:/bin:/sbin/nologin

6、-e多项编辑

[root@master shell]# sed -ne '/^root/p' -ne 's/^root/ROOT/p' a.txt
root:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash

7、-i修改源文件

[root@master shell]# cat a.txt
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@master shell]# sed -i 's/root/ROOT/g' a.txt 
[root@master shell]# cat a.txt 
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

8、-r扩展正则表达式

[root@master shell]# sed -nr '/^root|^bin/p' a.txt			打印以root或者以bin开头的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

其他命令

命令解释备注
r从其他文件中读取内容
&保存查找串以便在替换串中引用和\(\)相同
=打印行号
对所选行以外的所有行应用命令,放到行数之后
&是保留匹配的字符串,所以会在以bin开头的前边加上#
[root@master shell]# sed -n 's/^bin/#&/gp' a.txt
#bin:x:1:1:bin:/bin:/sbin/nologin

()需要转义,()内是被保留的字符串,\1保留匹配的字符串
[root@master shell]# sed -n 's/\(^bin\)/#\1/p' a.txt
#bin:x:1:1:bin:/bin:/sbin/nologin

从第3行后读取etc/hosts文件
[root@master shell]# sed '3r /etc/hosts' a.txt

打印除2到4行以外的行
[root@master shell]# sed -n '2,4!p' a.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

=是打印包含root关键字的行号
[root@master shell]# sed -n '/root/=' a.txt
1

二、脚本格式

[root@master shell]# cat file_sed.sh 
#!/bin/sed -f
#不可用引号保护命令
#每行的末尾不能有任何空格、制表符
2,4d
s/root/ROOT/g
p
[root@master shell]# sed -f file_sed.sh -n a.txt
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sed习题

1、利用sed命令在/etc/passwd中分别查找满足以下条件的行:
(1) o字符重复任意次
(2) o字符重复一次以上
(3) o字符重复两次以上

(1)

[root@master shell]# sed -n '/o*/p' /etc/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
...

(2)

[root@master shell]# sed -n '/o\{1,\}/p' /etc/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
...

(3)

[root@master shell]# sed -n '/o\{2,\}/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

2、利用sed命令将input文件中的\OU字符串修改为(ou)

[root@master shell]# cat input
dadsvld\OUd
dajfOd\OUdac
[root@master shell]# sed -i 's/\\OU/(ou)/g' input
[root@master shell]# cat input
dadsvld(ou)d
dajfOd(ou)dac

3、利用sed命令打印input文件中除第3^'8行之外的所有行,在以下三种不同选项组合下运行该命令:
(1)不带任何选项:
(2)只带一n选项;
(3)同时带一n和一p选项
并分析以上三种不同选项组合的区别。

input文件

[root@master shell]# cat input
1adsvld(ou)d
2ajfOd(ou)dac
3faa98fy
4faf9af
5faj2
6fgg46447
7sggsg36
8ghdh4
9hfjfj44
10sfsfsf33

(1)

[root@master shell]# sed '3,8d' input
1adsvld(ou)d
2ajfOd(ou)dac
9hfjfj44
10sfsfsf33

(2)

[root@master shell]# sed -n '3,8d' input

(3)

[root@master shell]# sed -n '3,8!p' input
1adsvld(ou)d
2ajfOd(ou)dac
9hfjfj44
10sfsfsf33

4、用两个不同的命令实现如下功能:将input文件中的\OU字符串修改为(ou),并在与、OU
的匹配行后追加“We find \OU!”字符串。

[root@master shell]# cat input
1adsvld\OUd
2ajfOd\OUdac
方式一
[root@master shell]# sed -n -e 's/\\OU/(ou)/g ; s/(ou).*$/&We find \\OU/gp' input
1adsvld(ou)dWe find \OU
2ajfOd(ou)dacWe find \OU
方式二
[root@master shell]# sed -n -e 's/\\OU/(ou)/g' -e 's/(ou).*$/&We find \\OU/gp' input
1adsvld(ou)dWe find \OU
2ajfOd(ou)dacWe find \OU

5、将input文件中的abcde字符分别用EDCBA替换。

[root@master shell]# cat input
1adsbvcled\OUd
2ajfOd\OUdac
abcde
[root@master shell]# sed 'y/abcde/EDCBA/' input
1EBsDvClAB\OUB
2EjfOB\OUBEC
EDCBA

6、写一个命令,去掉某文件中所有的空格符,并将结果存储到a.txt。

[root@master shell]# cat 1.txt
安冬 绍兴 96 87 96 94 97
图雅 绍兴 96 77 86 84 90
王波 岳阳 93 79 85 96 90
柏慧 无锡 94 76 82 86 91
李准 石家 86 92 76 83 87
张敏 南京 76 89 66 93 67
小飞 邢台 88 66 55 96 93
111	223       
     
a
a b2

[root@master shell]# sed -e 's/ \+//g' -e 's/\t//g' -e '/^$/d' 1.txt >>a.txt
[root@master shell]# cat a.txt
安冬绍兴9687969497
图雅绍兴9677868490
王波岳阳9379859690
柏慧无锡9476828691
李准石家8692768387
张敏南京7689669367
小飞邢台8866559693
111223
a
ab2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值