免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: send_linux
打印 上一主题 下一主题

ChinaUnix技术实践之四----Shell编程大赛! [复制链接]

论坛徽章:
0
61 [报告]
发表于 2011-05-19 17:28 |只看该作者
本帖最后由 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下以“程序名.随机后缀”为名读写方式创建一个临时文件,并在程序时退出时删除
  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里的记录信息将数据全部保存回文件


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

论坛徽章:
0
62 [报告]
发表于 2011-05-20 10:25 |只看该作者
做了很多年unix系统管理员,写过不少维护脚本,不过一看这些题,发现原来编写脚本,只是个菜鸟

论坛徽章:
0
63 [报告]
发表于 2011-05-20 14:14 |只看该作者
ed 其实也有临时文件,可以去/var/tmp底下看看

$ ls
00_000_TLD.txt  01_000_TLD.txt  a.out           support.out     upgrade.tar
-- ed .. in another session
$ ls
00_000_TLD.txt  01_000_TLD.txt  a.out           eaAAAIDa49D     support.out     upgrade.tar

论坛徽章:
0
64 [报告]
发表于 2011-05-20 15:27 |只看该作者
那我要再看下ed去, ,,, 答题时看想sed了,以为ed就是相反的

论坛徽章:
0
65 [报告]
发表于 2011-05-20 18:40 |只看该作者
shell版平时都是新手的乐园,这个帖子好多老人出现了。。

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
66 [报告]
发表于 2011-05-22 21:36 |只看该作者
我知道的时候就这么多人答完题了。看来我没有希望了。呵呵。抽空答一下。

论坛徽章:
0
67 [报告]
发表于 2011-05-23 01:54 |只看该作者
新手也参与一个,貌似只会回答第一个问题,我也给出不同的答案
问题1:
用最简洁的命令列出当前目录下的一级子目录,可以不包含隐藏目录(目录名以.开头的目录)
答:
ls -l|grep ^d   或者
ll|grep ^d

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
68 [报告]
发表于 2011-05-23 08:07 |只看该作者
晕,我怎么才看到这个帖子

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
69 [报告]
发表于 2011-05-23 08:13 |只看该作者
看了下题,只会做一半,剩下一半要查资料且第10题不会。

论坛徽章:
0
70 [报告]
发表于 2011-05-23 11:27 |只看该作者
echo */  这个命令用法不错,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP