免费注册 查看新帖 |

Chinaunix

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

[文本处理] sed 如何清空hold space [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-09-06 19:59 |只看该作者 |倒序浏览
有一个文本 由 [TIME]文本\n若干行文本\n[SQL_EXECUTE_TIME(ms)]文本\n   组成如下

[TIME]:2016-09-06 02:00:45
SELECT
balance_rule_id,
rule_type,
rule_desc
FROM  acct_test.BALANCE_TYPE_RULE_DESC
[SQL_EXECUTE_TIME(ms)]:28
[TIME]:2016-09-06 02:00:45
SELECT SYSDATE FROM DUAL
[SQL_EXECUTE_TIME(ms)]:1




现在想将 [TIME] 跟 [SQL_EXECUTE_TIME(ms)] 之间的文本都拼接为一行

我的语句如下 (换行替换为# 为了方便观察替换了多少个换行符)
思路是先将 pattern space(模式空间)都放到  hold space(保留空间)
直到匹配到 SQL_EXECUTE 然后将 复制 hold space 的内容到 pattern space 并将换行符替换,拼接成一行
清空 pattern space,hold space

sed -n 'H;/SQL_EXECUTE/{g;s/\n/#/gp;d;x;d
}
' file


执行结果如下
#[TIME]:2016-09-06 02:00:45#SELECT #balance_rule_id,#rule_type,#rule_desc ## FROM  acct_test.BALANCE_TYPE_RULE_DESC##[SQL_EXECUTE_TIME(ms)]:28
#[TIME]:2016-09-06 02:00:45#SELECT #balance_rule_id,#rule_type,#rule_desc ## FROM  acct_test.BALANCE_TYPE_RULE_DESC##[SQL_EXECUTE_TIME(ms)]:28##[TIME]:2016-09-06 02:00:45# SELECT SYSDATE FROM DUAL ##[SQL_EXECUTE_TIME(ms)]:1


看现象好像似乎没有清空掉 hold space的内存。
求高人指点。

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
2 [报告]
发表于 2016-09-06 20:20 |只看该作者
  1. sed ':a;/\n\[TIME/{P;D};N;s/\n/ /;/SQL_EXECUTE_TIME/!ba;'
复制代码

论坛徽章:
0
3 [报告]
发表于 2016-09-06 20:29 |只看该作者
2楼 你的语句我跑不了呢  我用的是 aix 系统
28gxbsn@hot5[/gxbsn/ZXBilling/lgb]$sed ':a;/\n\[TIME/{P;D
> }
> ;N;s/\n/ /;/SQL_EXECUTE_TIME/!ba;'  file
sed: 0602-417 The label :a;/\n\[TIME/{P;D is greater than eight characters.

论坛徽章:
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
4 [报告]
发表于 2016-09-06 20:35 |只看该作者
本帖最后由 moperyblue 于 2016-09-06 20:48 编辑
  1. sed -n 'H;/SQL_EXECUTE/{g;s/\n/#/gp;s/.*//;h}'
  2. sed '/TIME]/{:a;N;s/\n/#/;/SQL_EXECUTE_TIME/!ba}'
  3. sed '/TIME]/{h;d};H;/SQL_EXECUTE_TIME/{g;s/\n/#/gp};d'
复制代码

论坛徽章:
0
5 [报告]
发表于 2016-09-06 22:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
6 [报告]
发表于 2016-09-06 23:18 |只看该作者
回复 1# guang329

$ awk '/\[TIME/{ORS=" "}/\[SQL_EXECUTE/{ORS="\n"}1' FILE
[TIME]:2016-09-06 02:00:45 SELECT balance_rule_id, rule_type, rule_desc FROM  acct_test.BALANCE_TYPE_RULE_DESC [SQL_EXECUTE_TIME(ms)]:28
[TIME]:2016-09-06 02:00:45 SELECT SYSDATE FROM DUAL [SQL_EXECUTE_TIME(ms)]:1

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2016-09-07 08:11 |只看该作者
回复 1# guang329

sed '/\[TIME\]/{:a;N;/\n\[TIME\]/{P;D};s/\n/##/;ta}'

论坛徽章:
0
8 [报告]
发表于 2016-09-07 11:10 |只看该作者
回复 4# moperyblue请教一下4楼
你通过 s/.*//;h  这个方式清空hold space
我通过 d;x;d  怎么清空不了 hold space 呢   


回复 5# 本友会机友会摄友会
文本不大 只是想一个语句处理完 看起来简洁一点

回复 6# jason680
可行 awd也是不错的选择

回复 7# yinyuemi
貌似 aix 的sed 用了a参数都报
sed: 0602-417 The label /\[TIME\]/{:a;N;/\n\[TIME\]/{P;D};s/\n/##/;ta} is greater than eight characters. 这个错误


感谢大家帮忙 。
不过我还是有一点点疑惑
为什么通过 d;x;d  
删除 pattern space  
然后 x; 交换 pattern space  hold space
再次 删除 pattern space
不能把 hold space 清空掉呢。  
sed 是否有什么限制吗?





论坛徽章:
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
9 [报告]
发表于 2016-09-07 11:28 |只看该作者
回复 8# guang329

执行d后就会读入下一行了

info sed =>

`d'
     Delete the pattern space; immediately start next cycle.

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
10 [报告]
发表于 2016-09-07 12:20 |只看该作者
回复 8# guang329

d 后面的代码都会被忽略
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP