基本的sed命令

sed命令集合由25个命令组成,本文档我们介绍4个新的编辑命令:d删除 a追加 i插入 c更改。还要整一下改变脚本中流程控制(例如:决定下一步执行哪个命令)的方式。


sed命令的两点语法:

行地址对于任何命令都是可选的。它可以是一个模式,被描述为由斜杠、行号或者行寻址符合括住的正则表达式。大多数的sed命令能接受由逗号分隔的两个地址,这两个地址,这两个地址用来标识行的范围。这些命令的语法格式为:

[address]command

有一些命令只接受单个行地址。它们不能应用于某个范围的行,它的语法格式为:

[line-address]command

记住命令还可以用大括号进行分组以使其作用于同一地址:

address

{

command1

command2

command3

}

注意:第一个命令可以和大括号放置在一行,但是右大括号必须自己单独处于一行。每个命令都可以有自己的地址并允许有多层分组。而且,就像命令在大括号内的缩进方式一样,允许在行的开始处插入空格和制表符。

1、当sed不理解一个命令时,它打印出消息“Command garbled”(命令不清)。在命令后添加空格会产生一个小的语法错误,这个是不允许的,命令的结束必须在行的结尾处。2、如果命令之间用一个分号分割,那么可以将多个sed命令放在同一行。下面的示例在语句构成上是正确的。n;d,然而,在n命令后面放置一个空格会导致语法错误。而在d命令前面放置一个空格是可以的。3、不提倡在同一行上放置多个命令,因为即使将这些命令写在各自的行上,sed脚本也是很难阅读的(注意:更改、插入和追加命令必须在多行上指定,不能在同一行上指定)。


替换

n  指1到512之间的一个数字,表示对文本模式中指定模式第n次出现的情况进行替换。

g  对模式空间的所有出现的情况进行全局更改,而没有g通常是通常只有第一次出现的情况呗取代。

p  打印模式空间的内容

w  将模式空间的内容写到文件file中。


替换命令应用于与address匹配的行。如果没有指定地址,那么就应用于pattern匹配的所有行。如果正则表达式作为地址来提供,并且没有指定模式,那么替换命令匹配由地址匹配的内容。当替换命令是应用于同一个地址上的多个命令之一时,这将会非常有用。


和地址不同的是,地址需要一个作为定界符的斜杠(/),而正则表达式可以用任意字符来分配,只有换行符除外。因此,如果匹配的模式包含斜杠,那么可以选择另一个字符作为定界符,例如感叹号!。

s!/usr/mail!/usr/mail2!

注意:定界符出现了3次,而且在replacement之后是必需的。不管使用哪种定界符,如果它出现在正则表达式中,或者在替换文本中,那么就使用反斜杠来转义他。


replacement是一个字符串,用来替换与正则表达式匹配的内容。在replacement部分,只用下列字符由特殊含义。

&    用正则表达式匹配的内容进行替换

\n   匹配第n个字串(n是一个数字),这个字串以前在pattern中用"\("和"\)" 指定。

\     当在替换部分包含“与”符号(&),反斜杠(\)和替换命令的定界符时可以用\来转义它们。另外它用于转义符并创建多行replacement字符串。


注意:除了正则表达式中的元字符以外,sed的替换部分也有元字符。gp表示对行进行全局替换并打印这一行。


数字表示很少使用,在这种情况下,正则表达式在一行上重复匹配,而只需要对其中的某个位置的匹配进行替换。例如某输入行也许包含tb1输入,也许包含多个制表位。假设每行有3个制表符,并且要用">"来替换第二个制表位,则可以使用下面的替换命令完成该功能。

s/./>/2 其中.表示一个真正的制表符。而制表符在屏幕上是不可见的,如果输入的是一行文件,如下所示:

Column1.Column2.Column3.Column4对此文件使用以上命令后的结果如下:

Column1.Column2>Column3.Column4

注意:如果没有数字标识,则替换命令只替换第一个制表符(因此1可以被看作是默认的数字标志)


替换元字符

替换元字符是反斜杠(\),“与”符号(&)和\n。反斜杠一般用于转义其他的元字符,但是他在替换字符串中也用于包含换行符。

举例1:我们可以对前面的示例做一些改动,用换行符取代每行上的第二个制表符。

s/./\

/2

注意:在反斜杠后面不允许有空格,这个脚本产生如下的结果:

Column1.Column2

Column3.Column4

举例2:另一个示例来自于将troff文件转换成Ventura Publisher 的ASCII输入格式。它将下面的troff行:

.Ah "Major Heading"

转换成类似的Ventura  Publisher 行:

@A HEAD = Major Heading

这个问题重的难点是这一行需要前后都有空行。这是一个编码多行替换字符串的问题。

/^\.Ah/{
s/\.Ah */\
\
@A HEAD = /
s/"//g
s/$/\
/
}

第一个替换命令用两个换行符和'@A HEAD = ' 取代 ".Ah" ,在行结尾处有必要用反斜杠转义换行符。在第二个替换删除了引号。最后一个命令匹配模式空间中的行的结尾,并在他后面添加一个换行符。


如下例子:反斜杠用来转义“与”符号。他作为普通字符出现在替换部分。

s/ORA/0' Reilly \& Associates, inc./g

注意:如果在替换部分没有对“与”字符进行转义,输出的结果将变为:

0' Reilly  ORA Associates, inc.

作为元字符,“与”符号(&)表示模式匹配的范围,不是被匹配的行。可以使用与符号匹配一个单词并且用troff请求来包围它。下面的举例用点数请求包围一个单词:

 s/UNIX/\\s-2&\\s0/g

因为反斜杠也是替换字符串中的元字符,所以需要使用两个反斜杠来输出一个反斜杠,替换字符串中的“&”来表示"UNIX"。如果输入行为:

on the UNIX Operation System

那么替换命令将产生:

on the \s-2UNIX\s0  Operation System

当正则表达式匹配单词的变化时,“与”符号特别有用。它允许指定一个可变的替换字符串,该字符串相当于匹配的内容与实际内容匹配的字符串。