shell文件编辑工具,sed -i与ed的区别

着无聊,继续答题
问题:GNU sed 提供了-i选项,为什么有人说sed -i 并不象 ed 一样真正的编辑文件?(提示:观察文件改变前后的inode)

注意审题的话,这题是二个文件编辑器的比较,
也有可能是提示的误导,这题大都知道答-i 是用临时文件的机制,
但这道题如果不通过说明ed 的模式,再做sed -i 与ed 比较,
怎么看都不算完整

======sed的基本模式======
sed是一种“流编辑器”,特点尽在‘流’字上,有进有出,流进来,编辑处理(基于二个space的cycle)完后,流出去,
因此不像awk具有BEGIN模块,可以不依赖输入直接创造数据。sed程序一定要有输入。
同时除非用-n屏蔽了输出并且在cycle里边没有输出的动作,否则肯定也要有输出。
。。。
sed -i的编辑模式:将原文件rename成新文件名(tmpfile),以tmpfile为输入,一行一行处理后,输出保存到文件(与原文件同名)
按行操作,这个也是流编辑器的特点之一
======ed===========
ed,这个以前没用过,刚找男人问来的,今天闲着又翻了下源码看了下
ed的模式就是:scrach_file + line_buffer + command动作,
scrach_file是ed一开始调用标准tempfile函数创建的,tempfile在/tmp下以“程序名.随机后缀”为名读写方式创建一个临时文件,并在程序时退出时删除

  1. [root@rac0 tmp]# file ed.b3db5b
  2. ed.b3db5b: ASCII text, with no line terminators
复制代码

临时文件保存的是纯数据(无行结束符),而line_buffer有点像“元数据”,是内存中的一个结构链表,一个节点一个行信息,保存各行起始位移和长度
ed file命令下会在运行ed时一开始便将文件全部读取,数据去除换行符后存放到临时文件,行信息保存在line_buffer里,然后进行相关操作
ed里的命令w将根据buffer里的记录信息将数据全部保存回文件
ed对文件的编辑,可以说是在内存里保存了一份文件镜象,通过w将数据从内存回写到文件
========比较=========

所以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都不是“真正的编辑”文件

阅读更多
个人分类: unix/linux 脚本编程
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭