sed是简单小巧但功能非常强大的工具。在上一篇博客中自己注解了sed的info文档中那些比较复杂的脚本示例,最近工作中使用到sed,复习了一下,再做一篇总结放在这里:
- sed有两块缓冲区:pattern space和hold space。pattern space中存放待处理的目标文本,hold space供程序员自己使用。
- sed处理流程:
- 清空pattern space。(如果这是对该输入流的第一次读取,则也将hold space初始化为空)
- 从输入流中读取一行,去除末尾的换行符,将其放入pattern space。
- 执行sed脚本。sed脚本由一系列命令组成。因为sed是按行处理,所以sed命令的含义主要是“对于什么样的行,则进行什么样的处理”。例如,“把第3行删除”,或者“如果这一行包含this,则把其中的this替换成that”。其中“包含什么样的行”由address指定,“执行什么样的处理”由sed命令序列表达。
- 脚本执行完毕,如果输入流中还有内容,转至1,开始下一轮处理。
- 所以,学习sed,就是学习如何“指定需要处理的行”(address),以及学习我们能使用sed“进行什么样的操作”(command)。
- 注意的是,sed都是按行处理,即使指定的是一个address range,比如sed -e '3,7s/this/that/g',s命令会被执行5次(从第3行到第7行每行执行一次)而不是只执行一次就将第3到第7行的所有this换成that。可以使用sed的N命令或者其他命令读入多行文本到pattern space。
- sed使用/M或者/m来切换到"multiple line mode"(即多行处理模式)。所谓“多行处理模式”,是指在这种模式下,元字符^不再表示字符串起始位置,而是表示换行符后面的空字符串,元字符$也不再表示字符串末尾位置,而是表示换行符前面的空字符串。自我感觉这种模式没有任何作用,只会把问题弄得混乱,因为完全可以使用\n来匹配换行符,将其作为普通字符用在正则表达式中。
- sed中的调试非常简便,可以使用上一篇博客中的那个python脚本来调试sed,也可以使用sed中的l命令或者p命令来输出pattern space中的内容进行调试。在以下的“去除多余空行“的方法二中使用l命令进行调试。
练习几个例子,以便将来温习:准备以下文件:
hbwang@jcwkyl:/home/hbwang$cat test abc de f 1 2 345 en d int main () { printf("hello\n"); return 0; } last empty
- 去掉所有换行符:
- 方法一:vim打开文件,执行:1,$s/\n//即可。这里使用sed的方法&