2009-02-23

sed(1)--选项

sed是Stream EDitor的缩写. 它是一个文本处理器.

sed的调用格式是: sed [选项] [脚本] [待处理文件...]
其中的[脚本]就是用来处理文本的命令.

sed的工作方式
sed有两个缓冲区空间:pattern space和hold space. sed每次从输入流中读入一行,去掉行末的换行符,把它放入pattern space中,然后执行指定的脚本命令.其中可以规定命令在满足一定条件(一个地址)下才执行.执行完之后,如果没有使用-n选项,则之前去掉的换行符会被加回到pattern space中的这一行中,然后这一行就会被输出. 同时,如果没有使用特殊命令的话,这一行也从pattern space中清除. 然后sed再从输入流中读下一行,如此循环,直到文本处理完毕.

hold space是另一个缓冲空间.把这个空间与pattern space结合使用,可以实现一些特别的功能,例如模仿tac这个命令.

sed的比较常用的选项
-n, 这个选项让sed在执行完命脚本以后,不要输出pattern space中的内容;
~$ cat grep.test
hello
~$ sed -e '=' grep.test
1
hello
~$ sed -e '=' grep.test -n
1

其中的-e指明后面的就是要执行的脚本,而'='是输入行号的命令.上面第1次调用sed没有-n参数,所以在输出行号后又输出了pattern space中的内容.而第2次加了-n就没有输出

-i[SUFFIX],这个选项指示sed去修改原文件.如果指定了SUFFIX,sed就会以指定的后缀来保存原文件的备份.后缀中的星号(*)会被扩展为原文件名;这样就可以为原文件名加一个前缀.

$ ls
func.test grep.test

$ cat grep.test
hello

$ sed -e '=' grep.test -i.bak

$ ls
func.test grep.test grep.test.bak

$ cat grep.test
1
hello

$ sed -e '=' grep.test -iprefix-*

$ ls
func.test grep.test grep.test.bak prefix-grep.test

-r,这个选项使sed使用扩展的正则表达式(extended regular expression).扩展的正则表达式可以少使用很多的反斜扛.注意这个选项是GNU对sed的扩展.所以使用它可能会导致代码移植上的问题.下例中,'='前的就是一个用正则表达式来指定的条件.只有当满足这个条件(匹配dog或cat)才执行'='这个命令.关于指定条件的问题以后再详细介绍.
$ cat sed.test
cat
dog

$ sed -r -e '/dog|cat/=' -n sed.test
1
2

$ sed -e '/dog|cat/=' -n sed.test

$ sed -e '/dog\|cat/=' -n sed.test
1
2

-s,这个选项让sed各个文件分开处理,而不是合在一起处理.这样的结果是,行号不会跨文件,指定地址范围的时候也不可以跨文件.
$ sed -n -e '=' sed.test grep.test
1
2
3
4
5
6

$ sed -s -n -e '=' sed.test grep.test
1
2
1
2
3
4

-e和-f,这两个选项都是用来指明sed要执行的命令的.其中-e前面已经用了很多次了.-f的意思是从文件里读取命令.两个选项都可以出现多次.
$ cat sed.test
=

$ sed -f sed.test sed.test
1
=

$ sed -n -f sed.test -f sed.test sed.test
1
1


相关文章:
sed(2)--地址
sed(3)--命令

转载请注明出处 http://fornote.blogspot.com/

没有评论:

发表评论