sed(1) sed(1)
NAME
sed - 流编辑器
概要:
sed [-n] script [file ...]
sed [-n] [-e script] ... [-f script_file] ... [file ...]
描述:
sed根据脚本(最多可以包含100个命令)编辑指定的文件(默认是标准输入),然后拷贝编辑后的内容到标准输出.sed 是基于行的,按顺序对每一行执行命令,如果一个文件的最后一行不是以一个新行结束,文件的最后一行文本将被忽略.
选项:
sed可以识别下列选项:
-f script_file 将名为script_file的脚本文件作为脚本执行.
-e script 根据脚本进行编辑,如果只有一个-e选项并且没有-f选项,-e可以省略.
-n 禁止默认的输出操作.
sed按给定的顺序依次解释所有的-e script和-f script参数,使用时须注意:混合-e和-f选项时,应该考虑清楚执行顺序避免得到不正确的或者不期望的结果.
脚本:
一个sed脚本是由很多编辑命令组成,编辑命令每行一个,形式如下:
[address [, address]] function [arguments]
正常情况下,sed循环拷贝输入的每一行到模式空间(简称PS,除非在D命令后还有其他内容),然后对addresses匹配的那些行依次执行后面的命令,脚本结束后,将PS内容拷贝到标准输出(除了使用-n选项)然后删除PS内容.
有时候为了需要在后面访问前面PS中的数据,可以通过使用保留空间(简称HS)保存所有或者部分的PS的内容来实现.
命令地址:
地址或者是标明行号的十进制数,$表示最后一行;或者是上下文地址,也就是/regular expression/所匹配的行.
+ 上下文表达式地址中,结构/?regular expression?与/regular expression/等价,其中?可以为任意一个字符.注意:上下文地址情况下,/xabc/xdefx中第二个x代表本身,所以正则表达式为abcxdef.
+ 转义序列/n在模式空间内匹配一个新行.
+ 句点符号(.)匹配除了模式空间最后一个换行符外的任一字符.
+ 没有地址的命令对每一个模式空间都有效.(对每一行都有效)
+ 只有一个地址的命令只对匹配该地址的的行进行编辑
+ 带有两个地址的命令,匹配第一个地址到第二个地址之间的范围(如果第二个地址是一个数字并且小于等于第一个地址的值那么只匹配第一行)
sed支持基本的正则表达式语法.
编辑命令也可以使用否定函数(!)表示不执行对应的命令.
命令函数:
在下面的函数列表中,每个函数允许的最大地址数在圆括号中指出,涉及到的其他相关内容解释如下:
text 一行或者多行,如果一行最后以反斜杠(/)结尾,代表一个还有一行.在 s 命令中反斜杠被作为反斜杠本身处理.
rfile 必须在命令行的尾部,并且前面必须有一个空格.
wfile 必须在命令行的尾部,并且前面必须有一个空格.wfile在处理之前被创建.最多有10个不同的wfile参数.
sed识别下列函数:
(1)a/ text
添加,把text插入到模式空间中的当前行之后,然后输出.
(2)b label
跳转到:命令指定的标签出,如果没有指定标签,跳转到脚本结尾.
(2)c/ text
修改,在带有0个或者1个或者2个地址的表示范围的结尾处,将text内容放至输出,然后开始下一轮循环.(实际替换模式空间中的当前行,并返回脚本头部执行.)
(2)d 删除 pattern space 中的内容(可能是多行或单行),并返回脚本头部执行.
(2)D 删除pattern space中的第一个 /n之前的内容,并返回脚本头部执行
(2)g 直接用HS中的内容取代PS中的内容
(2)G 将 hold space 的内容附加到 pattern space 后面(附加时,自动在原行末尾加一个 /n )
(2)h 将PS的内容保存到HS中去
(2)H 在HS的内容之后放置一个换行符,且后面跟随PS的内容
(1)i/ text
在匹配行之后插入text内容然后输出.
(2)l 在标准输出列出PS内容,不能打印的字符以反斜线加3个八进制数字的形式输出,并且太长的行会自动换行.
(2)n 将PS内容拷贝到标准输出(如果命令行方式-n选项或者在脚本文件里#n命令没有使用),读入下一笔(下一行)资料到PS.
(2)N 添加下一笔(下一行)资料到PS,N只读一行,用循环可调用多次N来读多行.如果N遇到EOF,则sed退出(当前行号改变)
(2)p 打印PS内容.
(2)P 打印PS中的第一个 /n之前的内容.
(1)q 跳转到脚本结尾不再开始循环.
(1)r rfile
读取rfile的内容并在读取下一输入行以前将rfile内容输出.
(2)s/regular expression/replacement/flags
在PS内用replacement部分替换正则表达式匹配的部分,除了斜线(/)任何字符都可以使用.更全面的描述请看ed(1).
flags为0或者下列值:
n n=1-2048 (LINE_MAX).只在第n次出现的地方进行替换操作.
g 全局替换,替换所有的出现的匹配部分.
p 如果发生替换并且默认输出被关闭(用-n或者#n),则打印PS内容,
w wfile 如果发生替换的话,则把PS内容写入文件wfile.
(2)t label
t命令在读入一行或者上次t命令后如果有个s命令执行成功,那么t命令就跳转,否则不跳转;如果label为空,跳转到脚本结尾.
(2)w wfile
将PS内容追加到文件wfile.
(2)x 交换HS和PS的内容.
(2)y/string1/string2/
变换:变换关系是按两个串的字符list的位置对应变换.两个串的长度必须相等.
(2)! function
否定.作用于函数或者组(如果函数是{}括起来的)表示地址匹配的行不执行对应的函数.
(0): label
定义一个b或者t命令用来跳转的标签.
(1)= 将当前行的行号作为一行输出到标准输出.
(2){ 与}配对,括起来的多个命令作为一个命令组来执行,当某个模式空间匹配的时候顺序执行这些命令.语法如下:
{ cmd1
cmd2
cmd3
.
.
.
}
(0) 空命令,被忽略.
(0)# 如果#符号在行首出现,整个行作为注释.有一个例外:如果#后的字符为n表示默认输出被关闭,#n后面的其余部分也将被忽略.一个脚本文件必须至少有一个非注释的行.
外部影响:
环境变量
LANG为国际化变量没有被设置或者为空的情况下提供默认值:"C",如果任何一个国际化变量包含一个无效的设置,sed将所有的国际化变量都默认为"C".
(
该外部变量适用于除 install-sd 之外的所有 SD 命令。
确定显示消息所用的语言。如果未指定 LANG 或设置为空字符串,则使用缺省值“C”。
显示 SD 代理和守护程序日志消息所用的语言由系统配置变量脚本 /etc/rc.config.d/LANG 来设置.例如,/etc/rc.config.d/LANG 必须设置为“LANG=ja_JP.SJIS”或“LANG=ja_JP.eucJP”,以便用日语显示代理和守护程序日志消息.
也可以使用 export LANG= 命令。
有关详细信息,请参阅 lang (5) 联机帮助页。
)
LC_ALL 确定语言环境,用来覆盖 LANG 设置中或以 LC_ 开头的所有环境变量中指定的语言环境类别的任意值
LC_CTYPE 确定如何将文本数据的字节序列解释为字符(如供应商定义的属性的值使用单字节字符还是多字节字符).
LC_MESSAGES 确定编写消息应使用的语言
NLSPATH 确定LC_MESSAGES的处理消息目录的位置
国际字符集的支持:
支持Single- and multi-byte字符集.
例子:
将一个文件内的abc替换为xyz
sed 's/abc/xyz/' file1 >file1.out
实现上面同样的功能,但在查找和替换串时使用shell或者环境变量值var1和var2
sed "s/$var1/$var2/" file1 >file1.out
or
sed 's/'$var1'/'$var2'/' file1 >file1.out
单个命令实现多个替换,abc替换为xyz,lmn替换为rst
sed -e 's/abc/xyz/' -e 's/lmn/rst/' file1 >file1.out
or
sed -e 's/abc/xyz/' /
-e 's/lmn/rst/' /
file1 >file1.out
警告:
sed的脚本中命令总数不能超过100个,HS最大8192个字符.
sed只处理文本文件.
AUTHOR
sed was developed by OSF and HP.
SEE ALSO
awk(1), ed(1), grep(1), environ(5), lang(5), regexp(5).
sed: A Non-Interactive Streaming Editor tutorial in the Text
Processing Users Guide.
STANDARDS CONFORMANCE
sed: SVID2, SVID3, XPG2, XPG3, XPG4, POSIX.2
Hewlett-Packard Company - 6 - HP-UX 11i Version 2: August 2003