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字符串。