$ sed -n -e "/BEGIN/,/END/p" /my/test/file | more如果没发现 "BEGIN",那么将不打印数据 。如果发现了 "BEGIN",但是在这之后的所有行中都没发现 "END",那么将打印所有后续行 。发生这种情况是因为 sed 面向流的特性 -- 它不知道是否会出现 "END" 。C 源代码示例
如果只要打印 C 源文件中的 main() 函数,可输入:
$ sed -n -e "/main[[:space:]]*(/,/^}/p" sourcefile.c | more该命令有两个规则表达式 "/main[[:space:]]*(/" 和 "/^}/",以及一个命令 "p" 。第一个规则表达式将与后面依次跟有任意数量的空格或制表键以及开始圆括号的字符串 "main" 匹配 。这应该与一般 ANSI C main() 声明的开始匹配 。在这个特别的规则表达式中,出现了 "[[:space:]]" 字符类 。这只是一个特殊的关键字,它告诉 sed 与 TAB 或空格匹配 。如果愿意的话,可以不输入 "[[:space:]]",而输入 "[",然后是空格字母,然后是 -V,然后再输入制表键字母和 "]" -- Control-V 告诉 bash 要插入“真正”的制表键,而不是执行命令扩展 。使用 "[[:space:]]" 命令类(特别是在脚本中)会更清楚 。好,现在看一下第二个 regexp 。"/^}" 将与任何出现在新行行首的 "}" 字符匹配 。如果代码的格式很好,那么这将与 main() 函数的结束花括号匹配 。如果格式不好,则不会正确匹配 -- 这是执行模式匹配任务的一件棘手之事 。因为是处于 "-n" 安静方式,所以 "p" 命令还是完成其惯有任务,即明确告诉 sed 打印该行 。试着对 C 源文件运行该命令 -- 它应该输出整个 main() { } 块,包括开始的 "main()" 和结束的 "}" 。【通用线程--sed 实例,第1部分】下一篇
既然已经触及了基本知识,我们将在后两篇文章中加快步伐 。如果想看一些更丰富的 sed 资料,请耐心一些 -- 马上就有!同时,您可能想查看下列 sed 和规则表达式资源 。
推荐阅读
- 通用线程--sed 实例,第2部分
- FreeBSD下设置modem和modem的通用命令
- 什么叫多线程
- 和彩云支持普通用户上传多大文件
- 缝好衣服后怎么用短线快速打结?男女通用
- 医保是全国通用的吗
- 5e和steam皮肤通用吗
- 下 Solaris 10通用桌面CDE快速入门
- 中 Solaris 10通用桌面CDE快速入门
- 4 Solaris 8 新增功能一览--通用磁盘格式 (UDF) 文件系统