1.Sed
Stream EDitor, 行编辑器
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。
如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
参考:http://www.gnu.org/software/sed/manual/sed.html
2.用法
sed [option]... 'script' inputfile... (script: '地址命令')
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑,对每行处理时,可以有多个Script
-f: 把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
-r: 支持扩展的正则表达式
-i: 直接将处理的结果写入文件
-i文件名 在将处理的结果写入文件之前备份一份
3.sed工具
定址取决于对哪些行进行编辑。地址的格式可以是数字、正则表达式,或二者结合,如果没有指定地址,则sed将处理文件的所有行。
地址定界:
(1) 不给地址:对全文进行处理
sed -n 'p' 文件 打印全部内容
(2) 单地址:
#:指定的行
sed -n '2p' 文件 打印第2行
/pattern/:被此处模式所能够匹配到的每一行
sed -n '/linux/p' 文件 打印带有linux的行
(3) 地址范围:
#,#
sed-n '2,3p' 打印2-3行
#,+#
sed-n '2,+1p' 打印第2行和其后面2行,即2-4行
/pat1/,/pat2/
sed-n '/redhat/,/linux/p' 打印由有redhat的行开头,有linux的行为结尾
#,/pat1/
sed-n '2,/linux/p' 打印第2行到以后第一个linux所在的行为结尾
(4) ~:步进
sed-n '1~2p' 只打印奇数行
sed-n '2~2p' 只打印偶数行
(#1~#2意思就是从#1开始,每次都数下面+#2个数)
所以如图,2~3表示从2开始,每次数下面第3个数,就是2,5,8
4.编辑命令
d: 删除模式空间匹配的行,并立即启用下一轮循环
sed'2d' pets
p:打印当前模式空间内容,追加到默认输出之后
sed'2p' pets
a [\]text:在指定行后面追加文本
sed'2a\123\n456\n789' pets
i [\]text:在行前面插入文本
sed'2i\123\n456\n789' pets
c [\]text:替换行为单行或多行文本
sed'2c\123\n456\n789' pets (以上三条都支持使用\n实现多行追加)
w /path/somefile: 保存模式匹配的行至指定文件
sed-n '3w /root/3.file' pets
r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后
sed'3r /root/mage.txt' pets
=: 为模式空间中的行打印行号
sed'=' pets.bak
!:模式空间中匹配行取反处理
sed-n '2!p' pets
s///:查找替换,支持使用其它分隔符,s@@@,s###替换标记:
g: 行内全局替换
sed's/dog/cat/g' pets
5.示例
sed '2p'/etc/passwd 多打印一遍passwd第二行
sed -n '2p'/etc/passwd 只打印passwd第二行
sed -n '1,4p'/etc/passwd 打印passwd第 1-4行
sed-n '/root/p' /etc/passwd 打印passwd中带有root的行
sed -n '2,/root/p' /etc/passwd 打印passwd中从2行开始到有root的那行
sed -n '/^$/='file 显示空行行号
sed -n-e '/^$/p' -e'/^$/=' file 打印空白行并打印其行号
sed '/root/a\superman'/etc/passwd 在带有root的行后加入superman
sed '/root/i\superman'/etc/passwd 在带有root的行前加入superman
sed '/root/c\superman'/etc/passwd 将带有root的行替换成superman
sed '/^$/d' file 删除空白行
sed '1,10d' file 删除1-10行
nl /etc/passwd |sed '2,5d' 将passwd带有行号的列出然后删除2-5行
nl /etc/passwd |sed '2a tea' 将passwd带有行号的列出然后在第2行后面加上一行为tea
sed's/test/mytest/g' example 将每行的test都替换成mytest
sed -n 's/root/&superman/p'/etc/passwd 在passwd中带有root的行第一个root单词后加上superman,变成rootsuperman
sed -n 's/root/superman&/p'/etc/passwd 在passwd中带有root的行第一个root单词前加上superman,变成supermanroot
sed -e 's/dog/cat/'-e 's/hi/lo/' pets 将每行第一个dog变成cat,第一个hi变成lo
sed -i.bak 's/dog/cat/g'file 将file中的dog替换成cat存在file中,并将原来修改之前的file存在file.bak中
6.高级编辑命令
sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“保持空间(hold space)这2个空间的使用。
模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。
保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。
正常情况下,如果不显示使用某些高级命令,保持空间不会使用到!
前面基本用法中也有提到模式空间,即为处理文件中一行内容的一个临时缓冲区。处理完一行之后就会把模式空间中的内容打印到标准输出,然后自动清空缓存。
而这里说的保持空间是sed中的另外一个缓冲区,此缓冲区正如其名,不会自动清空,但也不会主动把此缓冲区中的内容打印到标准输出中。而是需要以下sed命令进行处理:
P:打印模式空间开端至\n内容,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会启动正常的新循环。
7、高级命令示例
sed -n'n;p' FILE 显示偶数行
sed'1!G;h;$!d' FILE 倒序显示
sed -n'1!G;h;$p' FILE 倒序显示
sed 'N;D' FILE 显示最后一行
sed'$!N;$!D' FILE 显示最后两行
sed '$!d'FILE 显示最后一行
sed‘G’FILE 每行后面加空行
sed‘g’FILE 把每行内容都替换成空行
sed‘/^$/d;G’ FILE 确保每一行下面都有且只有一个空行
sed 'n;d'FILE 显示奇数行
本文转自 Ty_endless 51CTO博客,原文链接:http://blog.51cto.com/tyendless/1961187