登陆 |  注册  |  我的客厅  |  我的圈子  |  管理中心  | 
厅主简介: 1212
布谷首页 > 客厅 > ghost > 日志
标签: sed
发布时间:2006.10.11 14:04
函数

所有函数都用一个单一字符来命名。在下面的总结中,允许地址的最大数目在成对的圆括号内给出,接着的单一字符是函数名字,可能有的参数包围在成对的尖括号(< >)内,单一字符名字的英语解释,并在最后描述每个函数做些什么。在参数外围的尖括号不是参数的一部分,在实际编辑命令中不应该键入。

3.1. 面向整行的函数

(2)d -- delete lines

d 函数从文件中删除(不写入输出)匹配它的地址的所有行。

它还有一个副作用,在这个已删除的行上将不再尝试进一步的命令;在执行了 d 之后,马上就从输入读取一个新行,在新行上从头重新启动编辑命令列表。

(2)n -- next line

n 函数从输入读取下一行,替代当前行。当前行被写入输出,如果应该的话。继续执行编辑命令列表在 n 命令之后的部分。

(1)a <文本> -- append lines

a 函数导致在匹配它的地址的行之后把参数<文本>写入输出。a 命令是天生多行的;a 必须出现在一行的结束处,而<文本>可以包含任意数目的行。为了保持一行一个命令的构想,内部的换行必须用给换行立即前导上反斜杠字符(‘’)的方式来隐藏。<文本>参数终止于第一个未隐藏的换行(没有立即前导反斜杠的第一个换行)。

一旦 a 函数成功的执行了,<文本>将被写入输出,而不管后来的命令对触发它的行会做些什么。触发的行可以被完全删除掉;而<文本>仍会被写入输出。

<文本>不被地址匹配所扫描,不尝试对它做编辑命令。它不引起行号计数器的任何变化。

(1)i <文本> -- insert lines

i 函数表现得等同于 a 函数,除了<文本>在匹配行之前写入输出之外。关于 a 函数的所有其他注释同样适用于 i 函数。

(2)c <文本> -- change lines

c 函数删除它的地址所选择的那些行,并把它们替代为在<文本>中的行。象 a 和 i 一样,c 必须跟随着被反斜杠隐藏了的换行;并且在<文本>中的内部的换行必须用反斜杠隐藏。

c 命令可以有两个地址,所以可选择一定范围内的行。如果找到,在这个范围内的所有行都被删除,只把<文本>的一个复本写入输出,而不是对每个删除的行都写一个复本。同于 a 和 i,<文本>不被地址匹配所扫描,不尝试对它做编辑命令。它不引起行号计数器的任何变化。

在一行已经被 c 函数删除之后,在这个已删除的行上将不再尝试进一步的命令。

如果 a 或 r 函数在某一行之后添加了文本,而这一行随后被 c 函数变更了,则 c 函数所插入的文本将会放置在 a 或 r 函数的文本之前。(r 函数在章节 3.4. 中描述)。

注意: 在这些函数放入输出的文本内,前导的空白和 tab 都会消失,象 sed 的编辑命令一样。要把前导的空白和 tab 放入输出中,需要在想要的第一个空白或 tab 之前前导反斜杠;这个反斜杠不会出现在输出中。

例子:

编辑命令的列表:

n
a
XXXX
d

应用于我们的标准输入,生成:

In Xanadu did Kubhla Khan
XXXX
Where Alph, the sacred river, ran
XXXX
Down to a sunless sea.

在这个特定情况下,下面两列命令列表会生成同样的效果:

n         n
i        c
XXXX      XXXX
d

3.2. 替换函数

这是一个非常重要的函数,它改变在一行之内通过上下文查找而选择出的这一行的某部分。

(2)s<模式><替代><标志> -- substitute 

s 函数替代行的(通过<模式>选择的)某部分为<替代>。它可以读做:

替换<模式>为<替代>

<模式>参数包含一个模式,它完全等同于地址中的模式(参见章节 2.2)。在<模式>和上下文地址之间的唯一区别是上下文地址必须用斜杠字符(‘/’)来界定;<模式>可以用不是空格或换行的任何其他字符来界定。

缺省的,只替换匹配<模式>的第一个字符串,参见后面的 g 标志。

<替代>参数紧接着<模式>的第二个分界字符之后开始,并且它必须立即跟随着分界字符的另一个实例。(所以准确的有三个分界字符的实例)。<替代>不是模式,在模式中有特殊意义的字符在<替代>中没有特殊意义。反而有特殊意义的字符是:

  • & 被替代为匹配<模式>的字符串。
  • d (这里的 d 是一个单一的数字)被替代为同<模式>中第 d 个包围在‘(’和‘)’内的部分相匹配的子串。如果在<模式>中出现嵌套的子串,第 d 个通过计数开分界符 (‘(’)来界定。同在模式中一样,特殊字符可以通过前导反斜杠(‘’)来变为文字。

<标志>参数可以包含任何下列标志:

  • g -- 把此行中<模式>的所有(不重叠)的实例都替换为<替代>,对<模式>的下一个实例的扫描就开始于插入的 这些字符之后;放置入行中的来自<替代>的字符不会被重新扫描。
  • p -- 打印此行,如果做了成功替换的话。p 标志导致把输入行写入输出,当且仅当这个 s 函数实际上做了替换。注意如果有多个 s 函数,每个函数都跟随着 p 标志,它们都在同一个输入行上成功的做了替换,会把这一行的多个复本写到输出: 每个成功的替换都写一个复本。
  • w <文件名> -- 把此行写入一个文件,如果做了成功的替换的话。w 标志导致实际上被 s 函数替代了那些行被写到<文件名>所指名的文件中。如果<文件名>在 sed 运行前就存在,则覆盖它。否则,就建立它。

必须用一个单一的空格分隔 w 和<文件名>。 

同 p 一样有着写入一个输入行的多个略有不同的复本的可能性。

在 w 标志和 w 函数(参见后面章节)之后可以提及的不同的文件名字合起来的最大数目为 10 个。

例子:

把下列命令应用于我们的标准输入,

s/to/by/w changes

生成,在标准输出上:

In Xanadu did Kubhla Khan
A stately pleasure dome decree:
Where Alph, the sacred river, ran
Through caverns measureless by man
Down by a sunless sea.

在文件‘changes’中:

Through caverns measureless by man
Down by a sunless sea.

如果不复制选项生效,命令:

s/[.,;?:]/*P&*/gp

生成:

A stately pleasure dome decree*P:*
Where Alph*P,* the sacred river*P,* ran
Down to a sunless sea*P.*

最后为了展示 g 标志的效果,命令:

/X/s/an/AN/p

生成(假定不复制模式):

In XANadu did Kubhla Khan

而命令:

/X/s/an/AN/gp

生成:

In XANadu did Kubhla KhAN

3.3. 输入输出函数

(2)p -- print

打印函数把寻址到的行写到标准输出文件。在遇到 p 函数的时候就写入它们,而不管后续的编辑命令对这些行会做些什么。

(2)w <文件名> -- write on <filename> 

写函数把寻址到的行写到<文件名>指名的文件中。如果这个文件以前就存在,则覆盖它;否则,就建立它。每行都按遇到写函数时现存的样子写入,而不管后续的编辑命令对这些行会做些什么。必须用精确的一个空格分隔 w 和<文件名>。在 s 函数的 w 标志之后和写函数中可以提及的不同的文件名字合起来的最大数目为 10 个。

(1)r <文件名> -- read the contents of a file 

读函数读入<文件名>的内容,并把它们添加到匹配这个地址的行的后面。读取这个文件并添加它的内容,而不管后续的编辑命令对匹配它的地址的这些行会做些什么。如果 r 和 a 函数在同一行上执行,来自 a 函数和 r 函数的文本按照这些函数执行的次序写入输出。必须用精确的一个空格分隔 r 和<文件名>。如果 r 函数提及的文件不能打开,它被当作一个空文件,而不是一个错误,所以不给出诊断信息。

注意: 因为对可以同时打开的文件数目是有所限制的,要小心在 w 命令或标志中不要提及多于 10 个(不同的)文件;如果有任何 r 函数出现,这个数目还会再减少一个。(在一个时候只能打开一个读取文件)。

例子

假定文件‘note1’有如下内容:

	Note: Kubla Khan (more properly Kublai Khan; 1216-1294) was the grandson and most eminent successor of Genghiz (Chingiz) Khan, and founder of the Mongol dynasty in China.

则下列命令:

 /Kubla/r note1

生成:

In Xanadu did Kubla Khan
	Note: Kubla Khan (more properly Kublai Khan; 1216-1294) was the grandson and most eminent successor of Genghiz (Chingiz) Khan, and founder of the Mongol dynasty in China.
A stately pleasure dome decree:
Where Alph, the sacred river, ran
Through caverns measureless to man
Down to a sunless sea.

3.4. 多输入行函数

有三个用大写字母拼写的函数特殊处理包含内嵌换行的模式空间;它们主要意图提供跨越输入中的行的模式匹配。

(2)N -- Next line

在模式空间中把下一行添加到当前行之后;两个输入行用一个内嵌的换行分隔。模式匹配可以延伸跨越这个内嵌换行。

(2)D -- Delete first part of the pattern space 

删除当前模式空间中直到并包括第一个换行字符的所有字符。如果这个模式空间变成了空的(唯一的换行是终止换行),则从输入读取另一行。在任何情况下,都再次从编辑命令列表的起始处开始执行。

(2)P -- Print first part of the pattern space

打印模式空间中的直到并包括第一个换行的所有字符。

P 和 D 函数等价于它们对应的小写函数,如果在模式空间中没有内嵌换行的话。

3.5. 保存和取回函数

有四个函数为将来的使用而保存和取回部分输入。

(2)h -- hold pattern space

h 函数把模式空间的内容复制到保存区域(销毁保存区域以前的内容)。

(2)H -- Hold pattern space

H 函数把模式空间的内容添加到保存区域的内容之后;以前和新的内容用换行分隔。

(2)g -- get contents of hold area

g 函数把保存区域的内容复制到模式空间(销毁模式空间以前的内容)。

(2)G -- Get contents of hold area

G 函数把保存区域的内容添加到模式空间的内容之后;以前和新的内容用换行分隔。

(2)x -- exchange 

对换命令交换模式空间和保存区域的内容。

例子

命令

1h
1s/ did.*//
1x
G
s/n/ :/

应用于我们的标准例子,生成:

In Xanadu did Kubla Khan :In Xanadu
A stately pleasure dome decree: :In Xanadu
Where Alph, the sacred river, ran :In Xanadu
Through caverns measureless to man :In Xanadu
Down to a sunless sea. :In Xanadu

3.6. 控制流函数

这些函数不在输入行上做编辑,但是控制函数到地址部分所选择的行的应用。

(2)! -- Don’t 

非命令导致(写在同一行上的)下一个命令,应用到所有的且只能是被地址部分选择到那些输入行上。

(2){ -- Grouping 

组合命令‘{’导致下一组命令作为一个块而被应用(或不应用)到组合命令的地址所选择的输入行上。在组合控制下的的命令中的第一个命令可以出现在与‘{’相同的一行或下一行上。

组合的命令由自己独立在一行之上的相匹配的‘}’终止。

组合可以嵌套。

(0):<标号> -- place a label

标号函数在编辑命令列表中标记一个位置,它将来可以被 b 和 t 函数所引用。<标号>可以是八个或更少的字符的任何序列;如果两个不同的冒号函数有相同的标号,就会生成编译时间诊断信息,而不做执行尝试。

(2)b<标号> -- branch to label

分支函数导致应用于当前输入行上的编辑命令序列,被立即重新启动到有相同的<标号>的冒号函数的所在位置之后。如果在所有编辑命令都已经被编译了之后仍没有找到有相同的标号的冒号函数,就会生成一个编译时间诊断信息,而不做执行尝试。

不带有<标号>的 b 函数被当作到编辑命令列表结束处的分支;对当前输入行做应做的无论怎样的处理,并读入其他输入行;编辑命令的列表在这个新行上从头重新启动。

(2)t<标号> -- test substitutions

t 函数测试在当前输入行上是否已经做了任何成功的替换;如果有,它分支到<标号>;否则,它什么都不做。指示已经执行了成功的替换的标志通过如下方式复零:

  • 1) 读取一个新输入行,或
  • 2) 执行 a 和 t 函数。

3.7. 杂类函数

(1)= -- equals 

= 函数向标准输出写入匹配它的地址的行的行号。

(1)q -- quit

q 函数导致把当前行写到标准输出(如果应该的话),任何添加的或读入的文本也被写出,而且执行会被终止。

 
人推荐
 
浏览(81) | 评论(0)
上一篇:整体操作
下一篇:地址:择要编辑的行
精彩评论
正在请求评论列表....
 
 
 发表评论
 
昵称: 注册 | 登录    
 
 
 
 厅主信息
年龄:2    职业:保密
积分:9   布谷蛋
个性签名:
     无
  
 
布谷客厅推荐   更多  
爱上自由的我
帅哥和美狗
 
厅主最新日志   更多  
暂无相关信息
 
美图欣赏推荐   更多  
恋人蜜语
郎才女貌
 
原创大赛作品   更多  
·老人——(我慈祥的 ·我们仨儿
·只是如此 ·雨幕
·我的灵魂 ·千古爱情
·狂傲吟 ·
·父亲之歌 ·我的灵魂
 
布谷相册推荐   更多  
若有所思若有所失
迷人花香迷人帅
 
精彩日志推荐   更多  
·这个冬天有些冷 ·瞬间美丽,瞬间逃匿。
·为爱做一个哑巴 ·珍惜生命中的十种人
·有才华的人会失败? ·谁是真正的庄家
·温暖的力量 ·好床伴的标准是什么?
·职场巧言保你不败! ·人生自是有情痴
 
布谷圈子推荐   更多  
羊城花园小区
丽都国际
 
原创日志推荐   更多  
·职场女性的八大“怕” ·上帝只掌握一半
·希望无敌 ·信念提升人生价值
·读一种安静的文字 ·生活,需要一种勇气
·谁会温暖我的手。 ·男欢女爱
·那无处安放的青春 ·一抬头间的落寞。
 
圈子热图推荐   更多  
林心如甜美的样子
成熟的男人
 
热门话题推荐   更多  
·断网能治本吗? ·什么是社会保险?
·孩子学坏很快 ·木家具≠绿色家具
·冬季人们怎么保健? ·网上购物如何选择?
·四大理财新观念 ·怎样为独生子女存款?
·沉迷网络易患抑郁 ·冬季更适合恋爱?

关于布谷 | 联系我们 | 友情链接 | 布谷帮助 | 免责声明 | 网站地图
广州亿码科技有限公司版权所有◎2000-2008    粤B2-20050444    网络实名:布谷    服务热线(9:00-18:00):020-38480358-1020  简化1  简化2