shell编程学习之sed
sedsed是流编辑器,是一个过滤工具,处理行
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、替换一个或者多个
# sed '1s/a/c/' 1.txt
# cat 1.txt
a
a
a
b
# sed '1s/a/c/' 1.txt
c
a
a
b
# sed 's/a/c/g' 1.txt
c
c
c
b
3、打印1到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
# 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行
# 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
# 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、选取一个范围
# 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
# 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、删除第二行(包括第二行)后面的行
# 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
# sed '2,$d' 1.txt #命令
root:x:0:0:root:/root:/bin/bash
7、删除包括某个字符所有的行
# 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
# sed '/nologin/d' 1.txt#命令
root:x:0:0:root:/root:/bin/bash
8、匹配类型:0000:11或者0000:12生日号
# cat 3.txt
1986:10 aaaaa
1977:1bbbbb
1986:11 aaaaa
1979:1bbbbb
1977:12 bbbbb
1986:12 aaaaa
# sed -ne '/\{4\}\:1/p' 3.txt
1986:11 aaaaa
1977:12 bbbbb
1986:12 aaaaa
9、在某个字符前面加#号,一般用于配置注释
# 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
# 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前面加上#号
# 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
# 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、在某个字符后面读入另一文件
# 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
# 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:1bbbbb
1986:11 aaaaa
1979:1bbbbb
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、匹配到并写入到另一个文件,但被写放的文件会被覆盖
# cat 3.txt
root:x:0:0:root:/root:/bin/bash
# sed -n '/daemon/w 3.txt' 1.txt
# cat 3.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
13、匹配某个字符再追加,一般在匹配的后面追加
# 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、匹配后插入,一般在匹配的前面插入
# 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
# cat txt
test 1234/1234/13456
yoyo abcd/EFGH/MJKL
# sed -n '/^test/p' txt |sed 's/\{4\}\/\{4\}\/\{4\}/12\/13\/47/'
test 12/13/476
16、同样以txt为例,匹配yoyo,修改 abcd/EFGH/MJKL变成aaaa:aaaa:aaaa
# cat txt
test 1234/1234/13456
yoyo abcd/EFGH/MJKL
# sed -n '/^yoyo/p' txt | sed 's/\{4\}\/\{4\}\/\{4\}/aaaa\:aaaa\:aaaa/'
yoyo aaaa:aaaa:aaaa
17、删除空格以及空白行
# cat txt
test 1234/1234/13456
yoyo abcd /EFGH/MJKL
# sed 's/[[:space:]]//g' txt #删除空格
test1234/1234/13456
yoyoabcd/EFGH/MJKL
# sed 's/[[:space:]]//g' txt|sed '/^$/d'#删除空格以及空白行
test1234/1234/13456
yoyoabcd/EFGH/MJKL
18、除了nologn结尾的,其他删除
# 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、小写变成大写
# 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、打印第三行后面所有字符
# 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这个单词用[]括起来
# cat 1.txt | sed 's/root\+/[&]/g'
:x:0:0::/:/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开头的,并把所有单词使用[]括起来
# sed -n '/^root/p' 1.txt | sed 's/\w\+/[&]/g'
:::::/://
23、在指定行插入
# 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这个单词
# 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这个单词
# 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这个单词
# 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
页:
[1]