分类: LINUX
2014-05-23 11:27:02
sed全名叫stream editor,流编辑器。用来对文本进行过滤与替换工作, sed通过输入读取文件内容,但一次仅读取一行内容进行某些指令处理后输出,sed更适合于处理大数据文件。
演示文本test.txt:
deb natty universe
deb-src natty universe
deb natty-updates universe
deb-src natty-updates universe
l s命令:
sed s/ubuntu/debian/ test.txt
将每一行的第一个ubuntu替换成debian了,但是后面的并没有替换,如果希望替换一行里所有的匹配字串,需要在s替换命令的最后加上g标记(g是global的意思)。
sed s/ubuntu/debian/g test.txt
sed可以用#号,或者@号,或者%号,^号来代替/号做分隔符号,这样就无需加转义符号来处理匹配串中的/号了,比如我们用file:///来替换http://可以写成sed s#
注:上述的sed并没有对文件的内容改变,只是把处理过后的内容输出,如果想将操作后的结果直接写回原文件,你可以给sed命令加上 -i选项sed –i s/ubuntu/debian/g test.txt;或重定向。
l p命令
将匹配行的整行内容输出,语法 /匹配正则表达式/p。(功能与grep相似)
sed /deb-src/p test.txt
deb natty universe
deb-src natty universe
deb-src natty universe
deb natty-updates universe
deb-src natty-updates universe
deb-src natty-updates universe
可以看到匹配的行打印了两遍,原因是sed在处理文本的时候,顺序的处理每一个输入行,默认情况下输入行也会作为输出行打印出来,如果要禁用默认输出,需要加 -n选项。
sed -n /deb-src/p test.txt
deb-src natty universe
deb-src natty-updates universe
l d命令
d命令的功能和p的功能相反,将匹配行删除。语法 /匹配正则表达式/d。(功能与grep –v 相似)
sed -n /deb-src/p test.txt
deb natty universe
deb natty-updates universe
l 操作区/地址(ADDRESS)
标准的一个sed命令其实分为两部分,分别为ADDRESS和COMMANDS。一条完整的命令是sed “ADDRESS COMMANDS“ filelist,其意思是对ADDRESS操作空间里的内容执行COMMANDS里的命令。如:只对某一行处理sed "4 s#" test.txt
address可以是一个数字,也可以是一个模式,你可以通过逗号要分隔两个address 表示两个address的区间,参执行命令cmd
l 命令行选项
-s separate,意思是将传入命令的文件参数分别对待,而不是将多个文件合成一个再处理。
-i in-place,意思就是输出结果写回原文件。-iSUFFIX选项还可以跟一个后缀参数,作用是在你文件操作修改原来文件的同时,会将那个文件以指明的后缀进行备份。
-r 扩展的正则表达式支持,使用该选项后可以使你的正则表达式更加简洁,省去一些不必要的反斜杠。
l 模式空间(pattern space)
sed的以1行为一个执行周期,完整过程如下:
1. 从输入流中读取一行,将该行放入模式空间。 可以将其理解为一个行缓冲区
2. 在条件满足的情况下,对该模式空间进行指定的命令操作。 所谓的条件,就是命令前的地址部分。看该行是否在命令前指定的那个ADDR中
3. 指定的命令执行完毕后,自动输出该模式空间。 如果在sed运行时加了-n选项,则不会自动打印输出模式空间
4. 抛弃模式空间的内容。读入下一行,开始一个新的周期。
l a (append)命令、i (insert)命令和c (change)命令
命令a\TEXT的作用是在一个sed处理周期结束后,输出内容TEXT。
命令i\TEXT的作用是在执行到这个命令的时候立刻输出内容TEXT。
命令c\TEXT的作用是执行到该命令的时候删除模式空间,并且输出TEXT的内容(替换匹配行)。