免费注册 查看新帖 |

Chinaunix

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

[文本处理] sed 多条件匹配插入行问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-29 18:55 |只看该作者 |倒序浏览
本帖最后由 rabbitkn 于 2013-08-29 19:23 编辑

文件中包含如下内容,行数不固定 test.conf

#     1 condition
#     2 condition

       4 condition

       5 other


如何在非#注释行匹配存在condition的行,并且在匹配的行前插入新行;

sed -n '/^#/!{/condition/{p};}' test.conf

可以找到匹配行,但怎么在找到的行前插入一行?

sed '/^#/!{/condition/{i\ 3 condition};};' -i  test.conf

sed: -e expression #1, char 0: unmatched `{'
不行啊

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
2 [报告]
发表于 2013-08-29 19:09 |只看该作者
本帖最后由 reyleon 于 2013-08-29 19:10 编辑
  1. sed '/^#/!i\newline'
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-08-29 19:21 |只看该作者
还有其他行的,列出的只是示例其中几行;
sed '/^#/!i\newline' 只是匹配行首无#的所有行;还要有condition匹配条件;

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
4 [报告]
发表于 2013-08-29 19:35 |只看该作者
@rabbitkn
  1. sed '/^[^#].*condition.*/i\newline' file
复制代码

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
5 [报告]
发表于 2013-08-29 19:58 |只看该作者
回复 3# rabbitkn


    没看清题目,那可以这样子:
  1. sed '/^#/!ba;b;:a;/condition/i\3 condition'
复制代码

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
6 [报告]
发表于 2013-08-29 20:00 |只看该作者

  1. sed '/^#/{p;d};/condition/i xxx' file
复制代码

论坛徽章:
0
7 [报告]
发表于 2013-08-29 20:31 |只看该作者
回复 4# cao627
经测试,这个可以满足要求;


   

论坛徽章:
0
8 [报告]
发表于 2013-08-29 20:34 |只看该作者
reyleon 发表于 2013-08-29 19:58
回复 3# rabbitkn


这个也可以满足要求,有点看不懂,能否解释下
ba;b;:a;什么意思?

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
9 [报告]
发表于 2013-08-29 20:46 |只看该作者
回复 7# rabbitkn
  1. sed '/^[^#].*condition.*/i\newline' file
复制代码
这个是有问题的。如果一行以condition开头,即condition之前没有任何字符,虽然满足 没有#,和有condition这两个条件 ,但不会被匹配到。
  1. sed '/^[^#].*condition\|^condition/i\newline' file
复制代码

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
10 [报告]
发表于 2013-08-29 20:48 |只看该作者

回复 8# rabbitkn


我也不知道咋解释,姑且看下:

  1. sed '/^#/!ba;b;:a;/condition/i\3 condition'

  2. man sed 中是这么说的:
  3.        b label
  4.               Branch to label; if label is omitted, branch to end of script.
  5. b命令姑且理解为一个无条件跳转命令,后面接定义的标签,如果没有接标签,就跳转到脚本的末尾,也可以理解为忽略后面的代码

  6. 1. 表示如果不是以#开头的行,就跳转到标签a处,然后接着执行后续的命令,也就是执行/condition/i\3 condition 这一段代码了,自然如果行匹配condition就插入一行咯;
  7. 2. 如果是以#开头的行,那么ba命令不会执行,接着往下走,执行到了b命令,因为b命令后没有接标签,,就跳转到脚本的末尾了,不会执行到/condition/i\3 condition,默认就打印这一行咯
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP