免费注册 查看新帖 |

Chinaunix

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

文本过滤问题 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
41 [报告]
发表于 2009-08-09 01:19 |只看该作者

回复 #1 wangjyl 的帖子

这个问题,前面Tim、大圣都给出了sed的解法,black更是给出了sed和awk两种解法,都很好。看得woodie也技痒难耐了,这里给出一个sed的方法,跟前面几位的不同,没用循环,纯用正则表达式来做:
sed -r 's/(("[^"]*"[^" ]*)*)\s+/\1|/g'
这行sed为了简洁,用了GNU sed的-r特性和\s(空白符号),不过很容易改写成兼容性更好的形式。

说到awk的解法,squall1兄弟的有点毛病。我也写了一个,不过必需要用到GNU AWK:
awk -v RS='"[^"]*"' '{gsub(" +","|");printf "%s", $0 RT}'

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
42 [报告]
发表于 2009-08-09 08:53 |只看该作者
Tim、大圣、woodie的sed方法只适用于特定文本,并不符合LZ的原意——"双引号里的空格保留,双引号外的空格变成|。"
对这样的文本就不适用了:
"a1" "bb 2"             ccc3
"a 1 " "bb 2"ccc3
dddd4 eeeee5

[ 本帖最后由 blackold 于 2009-8-9 09:38 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
43 [报告]
发表于 2009-08-12 16:00 |只看该作者
原帖由 blackold 于 2009-8-9 08:53 发表
Tim、大圣、woodie的sed方法只适用于特定文本,并不符合LZ的原意——"双引号里的空格保留,双引号外的空格变成|。"
对这样的文本就不适用了:
"a1" "bb 2"             ccc3
"a 1 " "bb 2"ccc3
dddd4 eeeee5

呵呵,black很细心啊。我的sed中的正则在成对双引号后面空格不出现的情况下会出错。那只用正则的话,看来只能通过positive lookbehind来做,可惜perl中positive lookbehind不支持变长的表达式。所幸vim中的\@<=是支持的:
vim ur-file <<\END
%s/\(^[^"]*\("[^"]*"[^"]*\)*\)\@<= \+/|/g
wq
END

sed中没有类似的0宽“断言”,看来只好循环了:
sed -r ':n;s/^([^"]*([^"]*[^ "]*)*) +/\1|/;tn'

perl的等价代码:
perl -ple '1 while s/^([^"]*(?:"[^"]*"[^" ]*)*)\s+/\1|/'

论坛徽章:
0
44 [报告]
发表于 2009-08-14 17:18 |只看该作者
原帖由 blackold 于 2009-7-29 16:17 发表
sed ':n;s/^\(\(\("[^"]*"\)\?\([^"]*[^ "]\)*\)*\) \+/\1|/;tn' urfile


能否解释一下,我看不明白

论坛徽章:
0
45 [报告]
发表于 2009-08-17 02:37 |只看该作者
原帖由 00306 于 2009-7-29 16:49 发表


关键是要多练习,我以前也是只看不自己动手去试,也就这两个星期才开始自己动手边试,会做的就自己先做,不会做的,等到高手们做出来了,我把他们的拿到自己机子上试,然后再总结有没有其它方法可以达到这个 ...


学习,我也要多动手才行

论坛徽章:
0
46 [报告]
发表于 2009-08-17 20:50 |只看该作者

回复 #1 wangjyl 的帖子

awk 好用了些了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP