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/
没有评论:
发表评论