- 论坛徽章:
- 0
|
本帖最后由 sosodream 于 2011-05-21 02:57 编辑
闲着无聊,继续答题
问题:GNU sed 提供了-i选项,为什么有人说sed -i 并不象 ed 一样真正的编辑文件?(提示:观察文件改变前后的inode)
注意审题的话,这题是二个文件编辑器的比较,
也有可能是提示的误导,这题大都知道答-i 是用临时文件的机制,
但这道题如果不通过说明ed 的模式,再做sed -i 与ed 比较,
怎么看都不算完整
======sed的基本模式======
sed的模式是基于二个space的cycle的“流编辑器”,流的特点:有进有出,一次一行,不能回退即不能重复读
sed -i的编辑模式:将原文件rename成新文件名(tmpfile),以tmpfile为输入,一行一行处理后,输出保存到文件(与原文件同名)
======ed===========
ed,这个以前没用过,刚找男人问来的,今天闲着又翻了下源码看了下
ed的模式就是:scrach_file + line_buffer + command动作,
scrach_file是ed一开始调用标准tempfile函数创建的,tempfile在/tmp下以“程序名.随机后缀”为名读写方式创建一个临时文件,并在程序时退出时删除- [root@rac0 tmp]# file ed.b3db5b
- ed.b3db5b: ASCII text, with no line terminators
复制代码 临时文件保存的是纯数据(无行结束符),而line_buffer有点像“元数据”,是内存中的一个结构链表,一个节点一个行信息,保存各行起始位移和长度
ed file命令下会在运行ed时一开始便将文件全部读取,数据去除换行符后存放到临时文件,行信息保存在line_buffer里,然后进行相关操作
ed里的命令w将根据buffer里的记录信息将数据全部保存回文件
========比较=========
所以sed -i 跟ed是二种不同的文件编辑模式,
从执行模式来区别:
sed -i是将文件存重命名为临时文件后做为输入流,按行读取进行cycle处理,输出保存到与原文件同名的新空文件里。
后者是将文件一次全部读取,然后将数据存放到内存buffer和临时文件里,处理完后再通过w命令回写入文件
从编辑对像来区别:
sed跟ed的单元动作都是以行数据为对象的,也程为行操作。不同在于
sed -i 的处理过程中,保存在内存里二个buffer的是部分行数据,可能是一行或多行数据
ed 处理过程中,保存在内存里的是所有的行信息。
从inode来区别:用inode来区分二者的编辑模式,也是一种方法
由于sed把原文件rename了,结果的文件inode已经非原来的inode了
这种情况下,可以加入sed -c操作,保留文件的inode不变了
-c是gnu sed 提供的,其他unix下的sed冒似不一定有(悲具的unix)
======================
这个题目出得有点让人郁闷,什么叫“真正的编辑文件”
真正的编辑文件,比如c程序(不带缓存的文件I/O)里OPEN文件后,直接根据描述符,对文件进行读写
而sed -i 实际上是流处理,ed在处理过程中实际上是在编辑“临时文件”
事实上个人觉得sed -i 跟ed都不是“真正的编辑”文件 |
|