LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 858|回复: 0

抄来的sed快速参考

[复制链接]
发表于 2006-4-5 12:49:05 | 显示全部楼层 |阅读模式
Sed Quick Reference

这里的内容大部份摘自 UNIX超级工具。
sed的操作方式如下

每行输入都会被复制到模式空间中

可以直接在命令行中输入编辑命令(多个命令请加-e选项)。也可以用-f选项来从脚本文件里得到编辑命令。所有的编辑命令都会按照文本的输入顺序作用于各行。

编辑命令会作用于所有的行(全局),除非用行寻址限定了命令所作用的行。

如果一个命令更改了输入,那么后续的命令地址就会作用于模式空间中当前行,而不是原始输入行。

原始输入文件不会被更改,编辑命令修改的是原始文件输入行的副本。除非使用-n选项,否则该副本会被 发送到标准输出。你可能需要重定向到一个文件。(但是别重定向到同一个文件,那样你的文件就被清空了!)

sed命令的语法

sed命令有通用的格式:

    [address][,address][!]command[arguments]

sed命令一肌包含地址address和编辑命令command. command包括单个字母或符号.arguments包括用于b或t的标签,用于r或w的文件名、用于s的替换标志."[something]"表示可选项.

在sed中,大括号({})用于把一个地址嵌套在另一个地址内空,或在相同的地址上应用多个命令.可以用多行分隔命令,或者用";".
模式寻址

一个sed命令可以指定0-2个地址. 这个地址可以是行号、符号$(表示最后一行)或者是包含在斜杠内的正则表达式. 除此之外,\n可以用来匹配模式空间中换行符(由N命令产生),但是不能匹配模式空间末尾的换行符.

sed命令概要

  1. #        在sed脚本中开始一个注释行.如果第一个注释行确切为#n,说明sed设置了命令行选项-n
  2. :        :label 给脚本的一行加上标签,以便使用命令b或t进行转移控制.参数label最多可包含7个字符.
  3. =        [address]= 把每一行的行号写到标准输出.
  4. a        [address]a\\n text 在匹配行后面添加文本.text可以包含多行,但换行符需要用\隐藏起来.
  5. b        [address1][,address2]b[label] 无条件转移到标签,默认转到脚本末尾.
  6. c        [address1][,address2]c\\n text 用文本替换地址所选择的行.如果指定了行的范围,那么所有的行会被作为一组被单个的文本替换.同a命令,文本的换行符需要隐藏起来
  7. d        [address1][,address2]d 删去匹配的行,因而不会发送到标准输出
  8. D        [address1][,address2]D 删去由命令N所创建的模式空间中的多行文本的第一部分(一起到插入的换行符为止),并脚本中的第一个命令恢复编辑.如果该命令清空了模式空间,那么就会读取一行新的输入,如同执行了命令d一样.
  9. g        [address1][,address2]g 把保留空间中内容粘贴到模式空间中,清除模式空间中原来的内容.
  10. G        [address1][,address2]G 同g功能相同,但是是追加到模式空间中.
  11. h        [address1][,address2]h 把模式空间中内容复制到保留空间中.
  12. H        [address1][,address2]H 把模式空间中内容追加到保留空间中.
  13. i        [address]i\\n text 在先前插入文本,参考a.
  14. n        [address1][,address2]n 把下一行读入到模式空间中.当前行发送到标准输出,下一行将成为当前行.控制将转移给n后面的所跟的命令,而不是回到脚本的开始处.
  15. N        [address1][,address2]N 把下一个输入行添加到模式空间的内容之后;这现行文本用一个插入的换行符分开.(该命令允许跨越两行进行模式匹配.)如果用\n来匹插入的换行符,那么可以跨越多行进行模式匹配.
  16. p        [address1][,address2]p 打印行,除非使用了命令行选项-n,否则这命令将导致输出相同的行.另外它常用于那些用于改变流控制的命令之前,并可能输出当前行.
  17. P        [address1][,address2]P 打印由命令N创建的多行模式的第一部分(一直到插入的换行符为止).如果没有应用命令N, 那么该命令的作用与p相同.
  18. q        [address]q 退出
  19. r        [address]r file 读取文件内容,并把它添加到模式空间的内容后面.命令r和文件之间必须刚好一个空格.
  20. s        [address1][,address2]s /pattern/replacement/[flags] 替换.flags可以为n(数字,指匹配的第n个),g,p, w file.
  21. t        [address1][,address2]t[label] 测试是否在寻址到的行上完成了任何替换,如果是将控制转移到标签,默认标签为脚本尾.
  22. w        [address1][,address2]w file 把模式空间中内容添加到文件中.遇到此命令即发生动作.w与file之间必须刚好一个空格.一次最多能打开10个文件.如果文件不存在,会创建之.存在,每次执行该命令时,它都会被重写一次.但多个直接输出到同一个文件的命令会在文件末尾进行追加.
  23. x        [address1][,address2]x 交换保留空间与模式空间中内容.
  24. y        [address1][,address2]y/abc/xyz/ 转换字符.a->x,b->y,c->z.
复制代码


这里还有一个是原书中例子,它同grep, 但是可以显示匹配的上下文。
也许是排版错误,改了一下才能运行(不知道改对了没有):

  1. #!/bin/sh
  2. # cgrep - 使用sed的多行上下文grep
  3. # 用法:cgrep [-context] pattern [file ...]

  4. n=3
  5. case $1 in -[1-9]*)
  6.    n=`expr 1-"$1"`
  7.    shift
  8. esac
  9. re=$(1?);shift

  10. sed -n "
  11.   1b start
  12.   : top
  13.   \~$re~{
  14.      h;n;p;H;g
  15.      b endif
  16.   }
  17.      N
  18.      : start
  19.      \~$re~{ = ; p;} # 原书这儿为: //{ =; p; }
  20.   : endif
  21.   $n,\$D
  22.   b top
  23. " "$@"
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表