GNU sed 提供了-i选项,为什么有人说sed -i 并不象 ed 一样真正的编辑文件

cu上的一道题目:

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

http://blog.csdn.net/ANLJF/archive/2011/05/19/6432879.aspx

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

======sed的基本模式======
sed是从名字和实际作用,就是“流编辑器”,
特点尽在‘流’字上,流进来,编辑处理(基于二个space的cycle)完后,流出去,
跟老毛说的白话一样:有进有出
以前有人说,sed不是独立的程序,也是这个原因,
不像awk具有BEGIN模块,可以创造数据。
他不能自己创造数据!sed必需有输入!
同时除非用-n屏蔽了输入并且在cycle里边没有输出的动作,否则肯定也要有输出。
上边的一些废话是为本题sed -i做的一些补充,
sed -i的编辑模式:将原文件rename成新文件名(临时文件名),从新文件一行一行读入,处理,然后流出保存为原文件名(新文件)
按行操作,这个是流编辑器的特点之一
虽然sed也可以通过一行一行全部读入后全文保存在内存里再做编辑
======ed===========
ed,这个以前没用过,刚找男人问来的
ed的名称不像sed那样"入流”,很简单的:文件编辑器
ed的模式理解起来也比sed简单:内存(缓存)文本操作
ed file是在运行ed时一开始便将文件读入内存,XX00处理完后,如果有w,再完整保存进文件里
ed对文件的编辑,可以说是在内存里保存了一份文件镜象,通过w将数据从内存回写到文件
========比较=========

所以sed -i 跟ed是二种不同的文件编辑模式,

从执行模式来区别:
前者是将文件存放为临时文件后做为输入流,一次读入一行,然后处理完后写入新文件
后者是将文件一次读入内存,然后对内存里的文件拷贝进行编辑完,回写入文件

从编辑对像来区别:
不考虑输出输入的话,二者的处理动作对像都是保存在内存里的数据
sed -i 内存里保存的是“行”的数据,可能是当前一行,也可能是当前多行
ed内存里保存的是“全文”数据
这也是题目说:编辑“文件”的原因之一

从inode来区别:
另一个原因,用inode来区分二者的编辑模式,也是一种方法
由于sed把原文件rename了,结果的文件inode已经非原来的inode了
这种情况下,可以加入sed -c操作,保留文件的inode不变了
-c是gnu sed 提供的,其他unix下的sed冒似不一定有(悲具的unix)

======================
这个题目出得有点让人郁闷,什么叫“真正的编辑文件”
事实上个人觉得sed -i 跟ed都不是“真正的编辑”文件
前者是编辑流,后者是内存编辑,
这二个都是内存编辑,不是文件编辑
不如一些语言,比如c程序(不带缓存的文件I/O)里OPEN文件后,直接根据描述符,对文件进行读写的这种编辑更“真正”
只不过,ed跟C程序(全缓存类的标准I/O)实现“类似”罢了

=======================

附sed 的一些实验:

以下是info sed 原文:
`-i[SUFFIX]'
`--in-place[=SUFFIX]'
This option specifies that files are to be edited in-place. GNU
`sed' does this by creating a temporary file and sending output to
this file rather than to the standard output.(1).


如下实验,原inode 661028 的文件处理完后变成了661027 ,已经不是原来inode的文件了
采用文件备份-ibk,可以看到原来的文件被rename了,创建了一个与原来名字一样的新文件做为输出结果
同时gnu也提供了-c选顶,临时文件采用copy的方式而不是rename的方式,这种方式下保留了原来的inode文件
不管有没有bk,或-c,gnu info文档自己都说了,这个-i选项的功能是通过临时文件完成的,并不是直接的在原文件上进行编辑

[root@rac0 tmp]# seq 5 >sed1
[root@rac0 tmp]# ls -li sed1
661028 -rw-r--r-- 1 root root 10 04-01 00:19 sed1
[root@rac0 tmp]# sed -i 'n' sed1
[root@rac0 tmp]# ls -li sed1
661027 -rw-r--r-- 1 root root 10 04-01 00:19 sed1
[root@rac0 tmp]# sed -ibk 'n' sed1
[root@rac0 tmp]# ls -li sed1{,bk}
661028 -rw-r--r-- 1 root root 10 04-01 00:19 sed1
661027 -rw-r--r-- 1 root root 10 04-01 00:19 sed1bk
[root@rac0 tmp]# sed -c -ibk2 'n' sed1
[root@rac0 tmp]# ls -li sed1{,bk,bk2}
661028 -rw-r--r-- 1 root root 10 04-01 00:21 sed1
661027 -rw-r--r-- 1 root root 10 04-01 00:19 sed1bk
661030 -rw-r--r-- 1 root root 10 04-01 00:21 sed1bk2
复制代码


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sosodream/archive/2011/05/19/6432808.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值