|
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命令概要
- # 在sed脚本中开始一个注释行.如果第一个注释行确切为#n,说明sed设置了命令行选项-n
- : :label 给脚本的一行加上标签,以便使用命令b或t进行转移控制.参数label最多可包含7个字符.
- = [address]= 把每一行的行号写到标准输出.
- a [address]a\\n text 在匹配行后面添加文本.text可以包含多行,但换行符需要用\隐藏起来.
- b [address1][,address2]b[label] 无条件转移到标签,默认转到脚本末尾.
- c [address1][,address2]c\\n text 用文本替换地址所选择的行.如果指定了行的范围,那么所有的行会被作为一组被单个的文本替换.同a命令,文本的换行符需要隐藏起来
- d [address1][,address2]d 删去匹配的行,因而不会发送到标准输出
- D [address1][,address2]D 删去由命令N所创建的模式空间中的多行文本的第一部分(一起到插入的换行符为止),并脚本中的第一个命令恢复编辑.如果该命令清空了模式空间,那么就会读取一行新的输入,如同执行了命令d一样.
- g [address1][,address2]g 把保留空间中内容粘贴到模式空间中,清除模式空间中原来的内容.
- G [address1][,address2]G 同g功能相同,但是是追加到模式空间中.
- h [address1][,address2]h 把模式空间中内容复制到保留空间中.
- H [address1][,address2]H 把模式空间中内容追加到保留空间中.
- i [address]i\\n text 在先前插入文本,参考a.
- n [address1][,address2]n 把下一行读入到模式空间中.当前行发送到标准输出,下一行将成为当前行.控制将转移给n后面的所跟的命令,而不是回到脚本的开始处.
- N [address1][,address2]N 把下一个输入行添加到模式空间的内容之后;这现行文本用一个插入的换行符分开.(该命令允许跨越两行进行模式匹配.)如果用\n来匹插入的换行符,那么可以跨越多行进行模式匹配.
- p [address1][,address2]p 打印行,除非使用了命令行选项-n,否则这命令将导致输出相同的行.另外它常用于那些用于改变流控制的命令之前,并可能输出当前行.
- P [address1][,address2]P 打印由命令N创建的多行模式的第一部分(一直到插入的换行符为止).如果没有应用命令N, 那么该命令的作用与p相同.
- q [address]q 退出
- r [address]r file 读取文件内容,并把它添加到模式空间的内容后面.命令r和文件之间必须刚好一个空格.
- s [address1][,address2]s /pattern/replacement/[flags] 替换.flags可以为n(数字,指匹配的第n个),g,p, w file.
- t [address1][,address2]t[label] 测试是否在寻址到的行上完成了任何替换,如果是将控制转移到标签,默认标签为脚本尾.
- w [address1][,address2]w file 把模式空间中内容添加到文件中.遇到此命令即发生动作.w与file之间必须刚好一个空格.一次最多能打开10个文件.如果文件不存在,会创建之.存在,每次执行该命令时,它都会被重写一次.但多个直接输出到同一个文件的命令会在文件末尾进行追加.
- x [address1][,address2]x 交换保留空间与模式空间中内容.
- y [address1][,address2]y/abc/xyz/ 转换字符.a->x,b->y,c->z.
复制代码
这里还有一个是原书中例子,它同grep, 但是可以显示匹配的上下文。
也许是排版错误,改了一下才能运行(不知道改对了没有):
- #!/bin/sh
- # cgrep - 使用sed的多行上下文grep
- # 用法:cgrep [-context] pattern [file ...]
- n=3
- case $1 in -[1-9]*)
- n=`expr 1-"$1"`
- shift
- esac
- re=$(1?);shift
- sed -n "
- 1b start
- : top
- \~$re~{
- h;n;p;H;g
- b endif
- }
- N
- : start
- \~$re~{ = ; p;} # 原书这儿为: //{ =; p; }
- : endif
- $n,\$D
- b top
- " "$@"
复制代码 |
|