最近看完了sed与awk(第二版)的sed部分,总结一下所学的东西,也算在记忆一遍。
1. 基本格式
sed [option] script filename
2. script: sed执行的脚本,也就是sed执行的命令
格式:'[模式]过程'
简单理解为:[addrs]instructions,即地址+指令
地址:就是一个正则表达式,简单理解为行号也可以
指令:sed基本指令和sed高级指令,下面介绍
地址举例(以删除命令d为例):
1> sed基本流程
d:删除所有行,没有地址,默认是整个文件的所有行
1d:删除第一行,1就是地址,表示第一行
1,4d:删除1到4行
$d:删除最后一行
/^$/d:删除空行
/exp1/,/exp2/d:删除从符合正则表达式exp1到符合正则表达式exp2的行
指令:可以是单个指令,也可以是一组指令(即在一行中应用多个指令)
分组指令格式:/exp1/{ // 注意:
instrction1
...
}
书上说:左大括号必须在行末,右大括号本身占一行,且大括号后面不能有空格。但是我在GNU sed 4.2.1上测试,没有这些限制。
3. sed基本命令
先读取一行到模式空间,然后将脚本中的每一个指令(一个接一个地)应用到该行上,当到达脚本底部时,即运行完所有的指令后,输出模式空间内容,然后清除模式空间,然后读入新行到模式空间,...,直到最后一行。
理解:
a:sed是一行为单位进行处理的,这里的“处理”就是执行所有脚本中的指令。即读入一行,执行所有的脚本指令,输出执行结果,然后再读入一行,再执行所有的脚本指令,再输出执行结果;...
b:并不是将脚本的一条指令应用到文件所有的行上
c:前面指令处理的结果影响到后面的指令
d:脚本指令只是对模式空间中的内容进行了处理,返回的结果也是模式空间中的内容,并没有改变源文件的内容,模式空间就是行缓存器,保持空间是一个临时缓存器,下面具体介绍
e:待添加
2>替换指令:s
格式:[addr]s/patten/replacement/flags
a:定界符:/。这里使用‘/’作为定界符,也可以用其他字符,换行符除外,当正则表示或替换模式中出现定界符时,用‘/’来转换
b:replacement中特殊字符:
&:表示patten的内容,即用于替换正则表示式的内容
/n:匹配patten中“/(”“/)”中的内容
/:转义其他字符,如&, /。
3>删除指令:d
删除模式空间的内容,当模式空间为“空”时,就不会再有其他指令执行,所以删除后sed会读取新行,从头再执行指令
4>追加:a;插入:i;更改:c
格式:[addr][a|i|c]/text
a:‘/’后的所有字符都包含在text内,包含前导空格,嵌入空格,换行符
当text是多行时,应在行最后加入‘/’,表示续行。
b:追加到当前行之后,插入到当前行之前,替换匹配行所有字符、
c:a、i指令不会改变模式空间内容,即通过a、i命令添加的内容不会被其他指令使用
c指令改变模式空间内容
思考:a、i指令不改变模式空间内容,但是最后可以正常输出,那么a、i指令的内容暂时存储在什么地方呢?书中没有介绍,待研究
5> 转换指令:y
主要用途:大小写转换,但是是转换模式空间所有的内容,不能只转换某一些字符串(如转换某个单词,单词的转换要用到sed高级指令)
6>打印指令:p
输出当前模式空间内容,可以用它随时查看模式空间内容
7>下一步指令:n
输出当前模式空间内容,并且读入下一行内容,继续执行n下面的指令,并没有按照sed基本流程那样,读取新一行时从开始再执行所有脚本指令,所以该指令改变了sed正常的流控制
8> 读写文件指令:r、w
格式:[addr]r|w filename
a:addr必须是确定的行号,不能使行号范围
b:r|w后有一个空格,空格后的所有字符都属于filename,包括前导空格、嵌入空格和换行符
c:r指令也不会影响模式空间(书中没有说,但在GNU sed 4.2.1版本试验得出)
明天再写吧!
总结一下,可以归纳为一句话:
sed基本流程:sed读取文件中的一行到模式空间,然后执行脚本指令,最后将模式空间内容输出,然后再读入下一行到模式空间。
当然sed高级用法中可能回改变这一流程,改变的地方主要是在执行脚本命令后。例如: 不输出模式空间内容;不读入下一行到模式空间等