免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 11490 | 回复: 42
打印 上一主题 下一主题

纯用sed,添加B.txt文件内容至A.txt文件头部。(不是尾部,尾部就简单喽) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-06 15:03 |只看该作者 |倒序浏览
本以为简单,倒腾了一天愣没搞定。
其实这个要求用cat B.txt A.txt >C.txt ;mv  -f  C.txt  A.txt即可完成。但考虑sed是强大的stream editer,就尝试了一下,但比较难。
我的要求是这样的:
1、纯用sed
2、使用-i的in-space模式,也就是直接更改原文件,不允许使用临时文件
3、不允许使用管道
如果使用临时文件和管道,我已经写了一个了:
sed -e '1iaaa' A.txt |sed -e '1r B.txt' |sed -e '1d' >C.txt;mv  -f  C.txt  A.txt(不好意思,写得比较烂)

。但满足以上条件的代码却一直写不出来。请高手指点,谢谢!
另,by the way,sed的r命令读入文件的时候据我的测试是不读入pattern space的,看info sed也没找到答案,请sed的高人是否可详细解释一下该命令,想完成满足上述要求的代码,理解r命令好像是重要一环。(呵呵,啰唆了)

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2006-07-06 15:25 |只看该作者
r的第一步就是打印pattern space,然后才试读文件,这个你绕不开吧?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
3 [报告]
发表于 2006-07-06 15:51 |只看该作者
另外,关于
不允许使用临时文件
不允许使用管道

给你个测试自己试试

  1. mkdir /tmp/test.sed-i
  2. cd /tmp/test.sed-i
  3. echo " just a test " >file
  4. sed -i  'p;p;p;p;p;p;:a;ba' file
  5. 按下^Z
  6. ls sed*
  7. cat sed*
复制代码

sed -i 就不用临时文件了么?

[ 本帖最后由 waker 于 2006-7-6 15:53 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-07-06 15:54 |只看该作者

呵呵,我想法是这样的

1、读入第一行的时候,用h命令把pattern space放到hold space,2、然后开始r3、读完以后通过g命令把hold space的内容放回来并显示。其实现在1、2没问题。3实现不了,不知“waker ”版主可能再指点指点,谢谢!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2006-07-06 16:11 |只看该作者
这个问题看似简单,不过r命令的表现却比较奇怪。LZ试试下面这个:
  1. sed -ine '1r B.txt' -e '1N;1!p' A.txt
复制代码

或者这个:
  1. sed -ine '1x;2{H;g;p;};3,$p;1r B.txt' A.txt
复制代码

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
6 [报告]
发表于 2006-07-06 16:13 |只看该作者
1、读入第一行的时候,用h命令把pattern space放到hold space,2、然后开始r
这时已经出问题了
第一行(pattern space)已经被打印了,即便pattern space是空的,也会打印出一个空行,你明白了么?

论坛徽章:
0
7 [报告]
发表于 2006-07-06 16:22 |只看该作者

呵呵,不好意思

我说的不用临时文件指的是“不显式的使用临时文件”。版主的代码受教了。
另,满足要求的代码我写出来了:

[root@taobao jjh]# sed -i '
> 1{
> x
> r B.txt
> }
> 2{
> H
> x
> }
> {
> /^$/d
> }
> ' A.txt

呵呵,代码本身不是很有意义,只是希望通过一些要求,一些练习去深入的理解sed。还得多先版主学习!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2006-07-06 16:26 |只看该作者
原帖由 tdyne 于 2006-7-6 16:22 发表
我说的不用临时文件指的是“不显式的使用临时文件”。版主的代码受教了。
另,满足要求的代码我写出来了:

[root@taobao jjh]# sed -i '
> 1{
> x
> r B.txt
> }
> 2{
> H
> x
> }
> {
> /^$/d
> }
> ' A.txt
...

不错!还有点小缺陷,原来的文件中如有空行也会被删除了。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
9 [报告]
发表于 2006-07-06 16:27 |只看该作者
恩,你可以用结果和 cat B.txt A.txt|wc -l 比较一下,是不是多了一行?

论坛徽章:
0
10 [报告]
发表于 2006-07-06 16:31 |只看该作者

回复“woodie”兄

首先表示感谢!但您提供的两个代码在我的系统都不满足要求:
代码一报错“sed: can't read 1r B.txt: No such file or directory“
代码二会在新形成的A.txt中头部先插入一个空行,并且原有的A.txt的内容每一行都变成了n多行,但n不等。
呵呵,欢迎讨论。
讨论不是目的,提高才是关键!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP