sed

sed是流编辑器,是一个过滤工具,处理行

 

 

1、sed参数

p 打印匹配行
= 显示文件行号
a / 在定位行号后附加新文本信息
i / 在定位行号后插入新文本信息
d 删除定位行
c / 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制A S C I I代码等价的控制字符
{ } 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行;允许跨行的模式匹配语句

 

 

2、替换一个或者多个

[test@linux-3 ~]# sed '1s/a/c/' 1.txt
[test@linux-3 ~]# cat 1.txt
a
a
a
b
[test@linux-3 ~]# sed '1s/a/c/' 1.txt
c
a
a
b
[test@linux-3 ~]# sed 's/a/c/g' 1.txt
c
c
c
b

 

 

3、打印1到3行

[test@linux-3 ~]# cat 1.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
[test@linux-3 ~]# sed -n '1,3p' 1.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

 

 

4、删除1到3行

[test@linux-3 ~]# cat 1.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
[test@linux-3 ~]# sed  '1,3d' 1.txt    #命令
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

 

5、选取一个范围

[test@linux-3 ~]# cat 1.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
[test@linux-3 ~]# sed -n '/root/,/2/p' 1.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

 

 

6、删除第二行(包括第二行)后面的行

[test@linux-3 ~]# cat 1.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
[test@linux-3 ~]# sed '2,$d' 1.txt        #命令
root:x:0:0:root:/root:/bin/bash

 

 

7、删除包括某个字符所有的行

[test@linux-3 ~]# cat 1.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
[test@linux-3 ~]# sed '/nologin/d' 1.txt  #命令
root:x:0:0:root:/root:/bin/bash

 

 

8、匹配类型:0000:11或者0000:12  生日号

[test@linux-3 ~]# cat 3.txt
1986:10 aaaaa
1977:1  bbbbb
1986:11 aaaaa
1979:1  bbbbb
1977:12 bbbbb
1986:12 aaaaa
[test@linux-3 ~]# sed -ne '/[0-9]\{4\}\:1[12]/p' 3.txt
1986:11 aaaaa
1977:12 bbbbb
1986:12 aaaaa

 

 

9、在某个字符前面加#号,一般用于配置注释

[test@linux-3 ~]# cat 1.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
[test@linux-3 ~]# sed 's/root/#&/' 1.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

 

 

10、删除第一和第二行,并在daemon前面加上#号

[test@linux-3 ~]# cat 1.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
[test@linux-3 ~]# sed -e '1,2d' -e 's/daemon/#&/' 1.txt
#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

 

 

11、在某个字符后面读入另一文件

[test@linux-3 ~]# cat 1.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
[test@linux-3 ~]# sed '/daemon/r 3.txt' 1.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
1986:10 aaaaa
1977:1  bbbbb
1986:11 aaaaa
1979:1  bbbbb
1977:12 bbbbb
1986:12 aaaaa
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

 

12、匹配到并写入到另一个文件,但被写放的文件会被覆盖

[root@linux-3 ~]# cat 3.txt
root:x:0:0:root:/root:/bin/bash
[root@linux-3 ~]# sed -n '/daemon/w 3.txt' 1.txt
[root@linux-3 ~]# cat 3.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

 

13、匹配某个字符再追加,一般在匹配的后面追加

[root@linux-3 ~]# sed '/root/a test test' 1.txt                  
root:x:0:0:root:/root:/bin/bash
test test
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

 

 

14、匹配后插入,一般在匹配的前面插入

[root@linux-3 ~]# sed '/^daemon/i test test' 1.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
test test
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

 

 

15、匹配以test开头,修改1234/1234/13456变成12/13/476

[root@linux-3 ~]# cat txt
test 1234/1234/13456
yoyo abcd/EFGH/MJKL
[root@linux-3 ~]# sed -n '/^test/p' txt |sed 's/[0-9]\{4\}\/[0-9]\{4\}\/[0-9]\{4\}/12\/13\/47/'
test 12/13/476

 

 

16、同样以txt为例,匹配yoyo,修改 abcd/EFGH/MJKL变成aaaa:aaaa:aaaa

[root@linux-3 ~]# cat txt
test 1234/1234/13456
yoyo abcd/EFGH/MJKL
[root@linux-3 ~]# sed -n '/^yoyo/p' txt | sed 's/[a-z]\{4\}\/[A-Z]\{4\}\/[A-Z]\{4\}/aaaa\:aaaa\:aaaa/'
yoyo aaaa:aaaa:aaaa

 

 

17、删除空格以及空白行

[root@linux-3 ~]# cat txt
    test 1234/1234/13456

 

 

yoyo abcd   /EFGH/MJKL
[root@linux-3 ~]# sed 's/[[:space:]]//g' txt     #删除空格
test1234/1234/13456

 

 

yoyoabcd/EFGH/MJKL
[root@linux-3 ~]# sed 's/[[:space:]]//g' txt|sed '/^$/d'  #删除空格以及空白行
test1234/1234/13456
yoyoabcd/EFGH/MJKL

 

 

18、除了nologn结尾的,其他删除

[root@linux-3 ~]# sed '/nologin$/! d' 1.txt
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

 

 

19、小写变成大写

[root@linux-3 ~]# sed 'y/root/ROOT/' 1.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

 

 

20、打印第三行后面所有字符

[root@linux-3 ~]# sed '3q' 1.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

 

 

21、root这个单词用[  ]括起来

[root@linux-3 ~]# cat 1.txt | sed 's/root\+/[&]/g'
[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

 

 

22、查找出root开头的,并把所有单词使用[  ]括起来

[root@linux-3 ~]# sed -n '/^root/p' 1.txt | sed 's/\w\+/[&]/g'
[root]:[x]:[0]:[0]:[root]:/[root]:/[bin]/[bash] 

 

 

23、在指定行插入

[root@linux-3 ~]# sed '2i test' 1.txt
root:x:0:0:root:/root:/bin/bash
test
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

 

 

24、在前面加上test  这个单词

[root@linux-3 ~]# sed 's/^/test /' 1.txt   
test root:x:0:0:root:/root:/bin/bash
test bin:x:1:1:bin:/bin:/sbin/nologin
test daemon:x:2:2:daemon:/sbin:/sbin/nologin
test adm:x:3:4:adm:/var/adm:/sbin/nologin
test lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

 

25、在后面加上  test这个单词

[root@linux-3 ~]# sed 's/$/ test/' 1.txt
root:x:0:0:root:/root:/bin/bash test
bin:x:1:1:bin:/bin:/sbin/nologin test
daemon:x:2:2:daemon:/sbin:/sbin/nologin test
adm:x:3:4:adm:/var/adm:/sbin/nologin test
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin test

 

 

26、只在单词nologin所在的行后面加上 test这个单词

[root@linux-3 ~]# cat 1.txt |sed -n '/nologin$/p' | sed -e 's/$/ test/'
bin:x:1:1:bin:/bin:/sbin/nologin test
daemon:x:2:2:daemon:/sbin:/sbin/nologin test
adm:x:3:4:adm:/var/adm:/sbin/nologin test
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin test