没有合适的资源?快使用搜索试试~ 我知道了~
首页玩透sed:探究sed原理.pdf
玩透sed:探究sed原理.pdf

sed原理、机制探究,适合sed深入。 文档包含4大篇修炼文章: sed修炼系列(一):花拳绣腿之入门篇 sed修炼系列(二):武功心法(info sed翻译+注解) sed修炼系列(三):sed高级应用之实现窗口滑动技术 sed修炼系列(四):sed中的疑难杂症
资源详情
资源评论
资源推荐

文章内容完全原创,本人保留所有权利
欢迎善意传播,杜绝恶意利用者
作者博客:骏马金龙(http://www.cnblogs.com/f-ck-need-u/)
Version:1.0 更新时间:2018-04-01
探究 sed 原理

本文档说明:
本人对 sed 的原理和机制做了些深入的研究(理论知识),小有心得。因此分享几篇 sed 修
炼的文章,从入门到深入。当然,可能不适合完全没接触过 sed 的纯初学者,建议去网上
找几篇 sed 的用法示例学学,有了基础之后,看这系列的文章想必不会有太大困难。
1.第一篇是入门篇,但却是最重要的一篇。虽然内容不算多,但在里面讲了绝大多数 sed
的工作机制,在后面几篇里都涉及到其中的概念。如果后面几篇文章有看不懂的术语,比
如 sed 循环、SCRIPT 循环、自动输出、回到 SCRIPT 循环顶部等,请看这篇文章。
2.第二篇是 info sed 的翻译篇,花了极大的心血,其中加入了很多注解,算是深入篇也算
是 sed 手册。如果想深入 sed 或者想完全了解 sed 工作机制,info sed 是必看文章,绝对
比看《sed & awk》收获大。另外,个人建议,不要阅读 man sed 文档。
3.第三篇是 sed 高级应用的一个通用型模板用法说明:窗口滑动。
这一篇中是一些很有用
的技巧,其内比较详细地介绍了"N"、"D"、"P"命令,也涉及了一些保持空间和 sed 标签
跳转的用法。但这些命令本就灵活多变,几篇文章是绝对不可能深入的了的,只能取一些
示例说明下,以后如果有时间,会专门开一篇文章收集一些 sed 高级用法的示例。
4.第四篇是 sed 中几个常见的疑难杂症解疑篇。内容不多,但真正在使用 sed 的时候可能
很有帮助。例如如何在 sed 中使用变量,引号怎么加,如何克服贪婪匹配等等。
第一篇文章(sed 花拳绣腿入门篇)是最重要的一篇,特别是其第一节和第四节是整个 sed
的重中之重,是 sed 的"神",而那些简单的 sed 用法、示例等等都是 sed 的"形"。如果是
sed 初学者,这些"神"的内容可略看一遍,在有了使用 sed 操作的基础之后,再仔细回头
琢磨这些"神"中的每一句话,必能深入 sed。此后,再去阅读第二篇文章(sed 武功心法)掌
握更细节的"形"和"神",最后阅读第三篇文章(sed 高级应用)掌握更高级的操作手段,在实
现复杂逻辑时往往能事半功倍,最后还可看看第四篇文章(sed 中的疑难杂症),在 sed 出
错却不知何解时,这篇文章往往能找到答案。
本文档中有些链接可能不是跳到文档的指定位置,而是跳到网站对应的文章
上,本人实在懒得一个一个去改跳转位置,忘谅解。
最后附上本人博客地址:博客园--骏马金龙
本人在博客园中分享了非常多的系列文章(如 shell、架构、MySQL),都很完
整,欢迎各位光临。
(
1).Linux 基础 & shell 系列文章总目录:
http://www.cnblogs.com/f-ck-need-u/p/7048359.html
(2).网站架构从 0 开始系列文章总目录:
http://www.cnblogs.com/f-ck
-need-u/p/7576137.html
(3).数据库系列文章总目录:
http://www.cnblogs.com/f-ck-need-u/p/7586194.html
如发现错误、或有疑惑之处 ,欢迎到本人博客区留言或者联系邮箱
mlongshuai@gmail.com。
博客园--骏马金龙
本文档包含4大篇文章,其中:

1.基本概念
sed 是一个流式编辑器程序,它读取输入流(可以是文件、标准输入)的每一行放进模式空间
(pattern space),同时将此行行号通过 sed 行号计数器记录在内存中,然后对模式空间中
的行进行模式匹配,如果能匹配上则使用 sed 程序内部的命令进行处理,处理结束后,从
模式空间中输出(默认)出去,并清空模式空间,随后再从输入流中读取下一行到模式空间
中进行相同的操作,直到输入流中的所有行都处理完成。由此可见,sed 是一个循环一个
循环处理内容的。
这是 sed 的一个循环的过程:
1. 读取输入流的一行到模式空间。
2. 对模式空间中的内容进行匹配和处理。
3. 自动输出模式空间内容。
4. 清空模式空间内容。
5. 读取输入流的下一行到模式空间。
上述整个循环过程中,第 2 步是我们写 sed 命令所修改的地方,其余的几个步骤,通过命
令行无法改变。但是,sed 有几个命令和选项能改变第 3、4 步的行为,使其输出总是输
出空内容或无法清空模式空间。
sed 程序的语法格式为:
sed OPTIONS SCRIPT INPUT_STREAM
其中 SCRIPT 部分就是所谓的 sed 脚本,它是 sed 内部命令的集合,sed 中的命令有些奇
特,它包含行匹配以及要执行的命令。格式为 ADDR1[,ADDR2]cmd_list。例如,要对第
2 行执行删除命令,其命令为 sed 2d filename,只输出第 4 行到 6 行,其命令为 sed -
n 4,6p。
sed 的内部命令非常多,但既然"花拳绣腿篇",当然只介绍些入门的东西。具体的行匹配方
法、有哪些命令以及哪些选项稍后解释。现在的重点是 sed 中的循环过程。既然 SCRIPT
是命令的集合,于是上面的循环过程可以修改为如下:
1. 读取输入流的一行到模式空间。
sed修炼系列(一):花拳绣腿之入门篇
文章内容完全原创,本人保留所有权利
欢迎善意传播,杜绝恶意利用者
作者博客:骏马金龙(http://www.cnblogs.com/f-ck-need-u/)
博客园--骏马金龙
本节为花拳绣腿招式入门篇,主要目的是入门,为看懂 sed 修炼系列(二):武功心法做准
备。虽然是入门篇,只介绍了基本工作机制以及一些选项和命令,但其中仍然包括了很多
sed 的工作机制细节。对比网上各 sed 相关文章以及介绍 sed 的书籍,基本上都只介绍了
sed 是如何使用的,却没有"How sed Works"这种工作机制的原理性内容,最多给出一段稍
微解释下。即使是非常流行的《sed & awk》也只是零零散散地介绍了一些 sed 工作机制
细节。
本节目录:
1 基本概念
2 sed 选项
3
定址表达式
4 sed 常用命令
5 总结

2. 对模式空间中内容执行 SCRIPT。(包括上面示例中的"2d"和"4,6p")
3. 读取输入流的下一行到模式空间。
4. 对模式空间中内容执行 SCRIPT。
其中 SCRIPT 部分包含了 sed 命令行中的内部命令,还包括两个特殊动作:自动输出和清
空模式空间内容。这两个动作是一定会执行的,只不过有些时候通过某些命令可以使其输
出空内容、使其清空不了模式空间。
如果使用编程结构来描述,则大致过程如下:
for ((line=1;line<=last_line_num;++line))
do
read $line to pattern_space;
while pattern_space is not null
do
execute cmd1 in SCRIPT;
execute cmd2 in SCRIPT;
execute cmd3 in SCRIPT;
……
auto_print;
remove_pattern_space;
done
done
其中 while 循环执行的正是 SCRIPT 中的所有命令,只不过一般情况下,while 循环只执行
一轮就退出并进入外层的 for 循环。于是,外层的 for 循环称之为"sed 循环",内层的 while
循环称之为"SCRIPT"循环。所以,for 循环只包含了两个动作:读取下一行和执行
SCRIPT 循环。
其实 while 循环中是有 continue、break 甚至是 exit 的,分别表示回到 SCRIPT 的顶端(即
进入下一个 SCRIPT 循环)、退出当前 SCRIPT 循环回到外层 sed 循环以及退出整个 sed
循环。显然,这不是"花拳绣腿"的内容。
最后,说明下 sed 命令行如何书写,其实就是写 SCRIPT 部分,这部分的写法比较灵活,
大致有以下几种:
#
一行式。多个命令使用分号分隔
sed Address{cmd1;cmd2;cmd3...}
#
多个表达式时,可以使用
"-e"
选项,也可以不用,但使用分号分隔
sed Address1{cmd1;cmd2;cmd3};Address2{cmd1;cmd2;cmd3}...
sed -e 'Address1{cmd1;cmd2;cmd3}' -e 'Address2{cmd1;cmd2;cmd3}' ...
#
分行写时
sed Address1{
cmd1
cmd2
cmd3
}
Address2{
cmd1
cmd2
cmd3
文章内容完全原创,本人保留所有权利
欢迎善意传播,杜绝恶意利用者
作者博客:骏马金龙(http://www.cnblogs.com/f-ck-need-u/)
博客园--骏马金龙
}

如果是写在文件中,即 sed 脚本,以文件名为 a.sed 为例。
#!/usr/bin/sed -f
#
注释行
Address1{cmd1;cmd2...}
Address2{cmd1;cmd2...}
......
其中 cmd 部分还可以进行模式匹配,也即类似于
Address{{pattern1}cmd1;{pattern2}cmd2}的写法。例如,/^abc/{2d;p}。
有了以上基本的大纲性知识,理解和深入 sed 机制就简单多了。
3.sed 选项
sed 选项不算多,能用到的更没几个。
sed OPTIONS SCRIPT INPUT_STREAM
可能用到的几个选项:
'-n'
默认情况下,sed 将在每轮 script 循环结束时自动输出模式空间中的内容。使用该选项
后可以使得这次自动输出动作输出空内容,而不是当前模式空间中的内容。注意,"-n"是
输出空内容而不是禁用输出动作,虽然两者的结果都是不输出任何内容,但在有些依赖于
输出动作和输出流的地方,它们的区别是很大的,前者有输出流,只是输出空流,后者则
没有输出流。
'-e SCRIPT'
前文说了,SCRIPT 中包含的是命令的集合,"-e"选项就是向 SCRIPT 中添加命令的。可
以省略"-e"选项,但如果命令行容易产生歧义,则使用"-e"选项可明确说明这部分是
SCRIPT 中的命令。另外,如果一个"-e"选项不方便描述所需命令集合时,可以指定多个"-
e"选项。
'-f SCRIPT-FILE'
指定包含命令集合的 SCRIPT 文件,让 sed 根据 SCRIPT 文件中的命令集处理输入流。
'-i[SUFFIX]'
该选项指定要将 sed 的输出结果保存(覆盖的方式)到当前编辑的文件中。GNU sed 是通过
创建一个临时文件并将输入写入到该临时文件,然后重命名为源文件来实现的。
当当前输入流处理结束后,临时文件被重命名为源文件的名称。如果还提供了 SUFFIX,
则在重命名临时文件之前,先使用该 SUFFIX修改源文件名,从而生成一个源文件的备份
文件。
临时文件总是会被重命名为源文件名称,也就是说输入流处理结束后,仍使用源文件名的
文件是
sed 修改后的文件。文件名中包含了 SUFFIX的文件则是最原始文件的备份。例如
文章内容完全原创,本人保留所有权利
欢迎善意传播,杜绝恶意利用者
作者博客:骏马金龙(http://www.cnblogs.com/f-ck-need-u/)
博客园--骏马金龙
剩余72页未读,继续阅读













安全验证
文档复制为VIP权益,开通VIP直接复制

评论1