Sed 数据流编辑器
sed是一种流编辑器,是文本处理中非常有用的工具,配合正则表达式使用。sed处理时,把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。sed不修改文件内容,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。
常用选项:
-e script 以选项中指定的script来处理输入的文本文件
-f script 以选项中指定的script文件来处理输入的文本文件
-n 显示scrip处理后的结果
-e 后可跟多个操作
-i 对源文件进行修改操作
常用命令:
a 在匹配到的行后面追加新行
d 删除选择的行
s 替换指定的字符
i 在匹配到的行前面添加新行
r 在匹配到的行后读文件
p 打印模板块的行
w 匹配到的行写到文件(覆盖)
替换标记:
g 行内全面替换
p 打印行
i 忽略大小写
y 把一个字符翻译成另外的字符
\1 子串匹配标记
& 已匹配字符串标记
实例:
准备测试文件
#!/bin/bash
echo $1
shift
echo $1
shift
echo $1
-n选项 和p命令 只打印符合条件的内容
[root@localhost ~]# sed "1,3p" -n shift.test
#!/bin/bash
echo $1
a 在匹配到的行后面追加新行
[root@localhost ~]# sed '/^ec/a \hello wolrd ' shift.test
#!/bin/bash
echo $1
hello wolrd
shift
echo $1
hello wolrd
shift
echo $1
hello wolrd
i 在匹配行前面追加新的行
[root@localhost ~]# sed '/^ec/i \hello wolrd ' shift.test
#!/bin/bash
hello wolrd
echo $1
shift
hello wolrd
echo $1
shift
hello wolrd
echo $1
在匹配到的行后面追加两行 \n表示换行
[root@localhost ~]# sed '/^ec/i \hello wolrd\nhello world ' shift.test
$d 删除文件最后一行
$p 输出最后一行
r 在匹配到的行后读入文件
[root@localhost ~]# cat test
haha,nihao
[root@localhost ~]# sed '/^shift/r ./test' shift.test
#!/bin/bash
echo $1
shift
haha,nihao
echo $1
shift
haha,nihao
echo $1
shift
haha,nihao
echo $1
w 匹配到的行写到文件(覆盖)
[root@localhost ~]# sed '/^shift/w /new' shift.test
#!/bin/bash
echo $1
shift
echo $1
shift
echo $1
shift
echo $1
[root@localhost ~]# cat /new
shift
shift
shift
s 查找并替换 s/匹配模式/要替换内容/
[root@localhost ~]# sed 's/ec/ce/' shift.test
#!/bin/bash
ceho $1
shift
ceho $1
shift
ceho $1
shift
ceho $1
[root@localhost ~]# sed '1,3s/ec/ce/' shift.test 指定区间
[root@localhost ~]# sed '1,3s/ec/ce/g' shift.test 全局
[root@localhost ~]# sed '1,3s/ec/ce/gi' shift.test 忽略大小写
-f 以选项中指定的script文件来处理输入的文本文件
[root@localhost ~]# cat script
/^#bind=.*/a \bind=192.168.1.1
/^#port=.*/a \port=3306
[root@localhost ~]# sed -f script mysqld
[mysqld]
#bind=0.0.0.0
bind=192.168.1.1
#port=3306
port=3306
#password=123456
-e 后可跟多个操作
[root@localhost ~]# sed -e'1,3s/ec/ce/' -e'1,3d' shift.test
例1:①、输出以root开头并且以bash结尾的行
[root@localhost ~]# sed '/^root.*bash$/p' -n /etc/passwd (指某一行)
root:x:0:0:root:/root:/bin/bash
②、输出以root开头以bash结尾的行
[root@localhost ~]# sed '/^root/,/bash$/p' -n /etc/passwd 指以root开头,以bash结尾的区间 (指不同行)
root:x:0:0:root:/root:/bin/bash 匹配到此行以root开头,则此行不再继续往下匹配以bash结尾这个条件,然后取下一行进模式空间,去匹配是否以bash结尾
bin:x:1:1:bin:/bin:/sbin/nologin 中间行
daemon:x:2:2:daemon:/sbin:/sbin/bash 匹配到此行以bash结尾。
例2:\(..\)用于匹配子串,对于匹配到的第一个子串标记为\1,依此类推匹配到的第二个结果就是\2
先匹配(/总内容/ ) 在分组 \(内容\) 从左往右,从外到里
[root@localhost ~]# sed 's/\(f\)\( l.*e\)/\1x\2y/g' yinyong 首先找到/f l.*e/,然后分组,第一组f 第二组 l.*e 然后替换,第一组后追加x,第二组后追加y
love
like
lhhove
lovve
lovee
flove
fx livey
例3:grep与sed
grep -A 2 root /etc/passwd 显示匹配到行和后两行
sed '2,+1p' /etc/passwd
grep -B 2 root /etc/passwd 显示匹配到行和前两行
sed '2,-1p' /etc/passwd 不能用,不能查看前一行,因为按行匹配,不回头。