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
本文出自 “游造技术博客” 博客,转载请与作者联系!