sed学习笔记

sed是基于字符流的编辑器。 要想很好的运用sed这一神器,必须懂得它的三个原理:

1、脚本中的所有编辑命令都将依次应用于每个输入行(也就是说sed是隐式全局的);

2、命令应用于所有的行(全局的),除非程序员限制;

3、原始的输入文件并没有改变,编辑命令修改了原始文件的备份,并且将此备份发送到标准输出。

sed执行顺序是将所有编辑命令应用于第一行,处理结束之后再应用于第二行,依次类推,与我之前认为的相反。sed维护一个模式空间,也就是临时缓冲区,在应用编辑命令时,将文件的某一行存储在模式空间中,然后依次应用编辑命令。

在sed中一般用单引号将指令包围起来,单引号可以阻止shell解释编辑指令中的特殊字符或者空格。

有三种方式可以指定命令行上的多重指令:

1、在单引号中用分号分隔指令;

2、在每个指令前放置选项-e;

3、使用Bource shell的分行指令功能,即在单引号中按ENTER键。

默认情况下,sed自动将输出打印到标准输出(一般情况下是屏幕),也就是说默认操作是输出每个输入行(可以用选项-n阻止自动输出),我们可以将结果重定向到指定文件,但是必须保证该文件不是正在编辑的文件,否则会出现乱码。

sed命令可以指定零个、一个或两个地址。每个地址都是一个描述模式、行号或者行寻址符号的正则表达式:

1、如果没有指定地址,那么命令将应用于每一行;

2、如果只有一个地址,那么命令应用于匹配该地址的任何行;

3、如果指定了由逗号分隔的两个地址,那么命令应用于匹配第一个地址的第一行和它后面的行,直到匹配第二个地址的行(包括此行)。

4、如果地址后面有感叹号,那么命令将应用于不匹配该地址的所有行。

 

分组命令

sed使用大括号({})将一个地址嵌套在另一个地址中,或者在相同的地址上应用多个命令。如果想指定行的范围,然后在这个范围内指定另外的地址,则可以嵌套地址。

注意:左大括号必须在行末,而且右大括号本身必须单独占一行。要确保在大括号之后没有空格。


sed替换

语法:

[address]s/pattern/replacement/flags

flags选项:

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

g:对模式空间出现的情况进行全局更改,而没有g选项时,只对第一次出现的情况修改;

p:打印模式空间的内容;

W file:将,模式空间的内容写到文件file中。

替换命令应用于address匹配的行,如果没有指定address,那么替换所有pattern匹配的行。如果正则表达式作为地址提供,并且没有指定模式,那么替换命令匹配由地址匹配的内容。地址需要一个作为定界符的斜杠(/),而正则表达式可以用任意字符分割(换行符除外)。

replacement:

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

&:用正则表达式的内容进行替换;

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

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

posted @ 2012-03-21 23:50  leealways87  阅读(761)  评论(0编辑  收藏  举报