免费注册 查看新帖 |

Chinaunix

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

[文本处理] 把一个文件插入另一个文件指定字符串后面的脚本(不是指定行哦) [复制链接]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-08-10 06:20:00每日论坛发贴之星
日期:2016-08-10 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-07 15:22 |只看该作者 |倒序浏览
本帖最后由 ytsmtipe 于 2016-08-07 15:23 编辑

现在两个文件,内容如下:
  1. dsp@dsp:~/source_code/tmp_dir$ cat t
  2. <A>
  3.      <B></B>
  4.      <C></C>
  5. </A>
  6. dsp@dsp:~/source_code/tmp_dir$ cat a
  7. 123
  8. 456
  9. dsp@dsp:~/source_code/tmp_dir$
复制代码
想实现一个脚本把"a"文件的内容插入到"t"文件的"<B>"后面,实现的效果要求是这样的:
  1. dsp@dsp:~/source_code/tmp_dir$ cat t
  2. <A>
  3.      <B>123
  4. 456</B>
  5.      <C></C>
  6. </A>
复制代码
请问哪位大神有思路?谢谢!
我之前想到的一个命令:
  1. sed '/<B>/r a' t
复制代码
这个只能实现成如下这样的效果:
  1. dsp@dsp:~/source_code/tmp_dir$ sed '/<B>/r a' t
  2. <A>
  3.      <B></B>
  4. 123
  5. 456
  6.      <C></C>
  7. </A>
复制代码
这个显然不对。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2016-08-07 15:32 |只看该作者
回复 1# ytsmtipe

$ awk -va="`cat a`" '{sub("<B></B>","<B>"a"</B>")}1' t
<A>
     <B>123
456</B>
     <C></C>
</A>

   

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-08-10 06:20:00每日论坛发贴之星
日期:2016-08-10 06:20:00
3 [报告]
发表于 2016-08-07 15:39 |只看该作者
Perfect!
另外,有谁知道这个能通过sed来实现吗?谢谢!

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-08-10 06:20:00每日论坛发贴之星
日期:2016-08-10 06:20:00
4 [报告]
发表于 2016-08-07 15:54 |只看该作者
@jason680,
  如果t的内容是这样的要如何实现?谢谢!
  1. dsp@dsp:~/source_code/tmp_dir$ cat t
  2. <A>
  3.      <B>
  4. </B>
  5.      <C></C>
  6. </A>
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2016-08-07 15:56 |只看该作者
sub("<B></B>","<B>"a"</B>")

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-08-10 06:20:00每日论坛发贴之星
日期:2016-08-10 06:20:00
6 [报告]
发表于 2016-08-07 16:07 |只看该作者
佩服之至!

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
7 [报告]
发表于 2016-08-07 16:28 |只看该作者
本帖最后由 moperyblue 于 2016-08-07 16:35 编辑
  1. sed -r '1{x;s/.*/cat a/e;x};/<B>/{:a;/<\/B>/!{N;ba};G;s/(.*<B>).*(<[^\n]*)\n(.*)/\1\3\2/}' t
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
8 [报告]
发表于 2016-08-07 19:40 |只看该作者
  1. perl -nle 'if(m~(<B>)(</B>)~){print $1,`cat b`,$2;next}print' a
复制代码
<A>
<B>123
456
</B>
     <C></C>
</A>

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-08-10 06:20:00每日论坛发贴之星
日期:2016-08-10 06:20:00
9 [报告]
发表于 2016-08-07 23:43 |只看该作者
谢谢各位!
@moperyblue,或者哪位能够解释一下那个sed语句吗?特别是那个"1{”中的数字"1"是什么意思啊?谢谢!

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
10 [报告]
发表于 2016-08-07 23:47 |只看该作者
本帖最后由 moperyblue 于 2016-08-08 00:03 编辑

回复 9# ytsmtipe


    在第一行的时候将cat a (即:123\n456)内容 放到hold space,以便后续符合条件的时候调用它



如果能接受这样的结果格式
<A>
     <B>
123
456
</B>
     <C></C>
</A>

也可以用这种方式
  1. sed '/<B>.*<\/B>/s/>/&\n/' t|sed '/<B>/r a'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP