免费注册 查看新帖 |

Chinaunix

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

如果用正则表达式匹配并导出一段含换行符的文本? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-12 01:30 |只看该作者 |倒序浏览
10可用积分
有一个数据库的导出文本,大体上一条记录导出为一个文本文件,内容大致如下:
标题="工作报告", 日期="20090612", [x8j1356dqd]内容=" 2009年工作报告   
随着。。。。。
我们。。。。。。
所以。。。。。。
  最后,。。。。。 "[x8j1356dqd]作者="张三"


如例子中所示:
1、共有4个字段,分别是标题、日期、内容、作者(实际中可能比这个多),字段与字段之间可以换行,也可以在同一行上,以逗号分开。
2、每个字段的内容都可能包含换行符,内容前后可以加可选的边界字,此例中的“内容”中,[x8j1356dqd]就是用来确定“内容”字段的定义范围,x8j1356dqd是个随机值,确保唯一。

现在的想法是想通过LINUX下用文本处理提取特定的字段变量:
如果在vi里通过正则表达式查询应该可以确定字段区域,但不知道如何将内容提取出来(可能是跨行的,而且不是以整行为单位)
如果用sed或awk等处理,该如何做?

最佳答案

查看完整内容

那能不能确定引号部分不包含的字符呢?如果等号、引号、逗号、中括号、“标题”、“日期”、“内容”、“作者”这些都包含,大眼一看还真有点蒙~

论坛徽章:
0
2 [报告]
发表于 2009-06-12 01:30 |只看该作者
原帖由 sjhf 于 2009-6-16 17:44 发表
如果内容中也包含引号,是不是这样就不好处理了?

那能不能确定引号部分不包含的字符呢?如果等号、引号、逗号、中括号、“标题”、“日期”、“内容”、“作者”这些都包含,大眼一看还真有点蒙~

论坛徽章:
0
3 [报告]
发表于 2009-06-12 01:51 |只看该作者
再确认一下文本格式:
是否每个字段都是 XXX="xxx" 或者前后添加边界字符的格式?

论坛徽章:
0
4 [报告]
发表于 2009-06-12 02:04 |只看该作者
如果每个字段的赋值中没有'='和'"':

  1. awk -F\" -v RS="=" -v n=1 'NR>1&&(NR-1)%4==n{print $2}' URFILE

  2. n赋值为1、2、3、0时分别代表第1、2、3、4个字段。
复制代码

论坛徽章:
0
5 [报告]
发表于 2009-06-12 02:09 |只看该作者
再给一个选择,睡了。赋值中没有双引号即可:

  1. awk -v RS=\" -v n=1 '(NR/2)%4==n%4' URFILE

  2. n表示第几个字段。
复制代码

论坛徽章:
0
6 [报告]
发表于 2009-06-12 08:47 |只看该作者

  1. perl -e '
  2. $s="";
  3. while(<>){$s="$s$_";}
  4. $s=~/((\[.*?\])?)(内容)="(.*?)"\1,?/s;
  5. print "$4\n";'  datafile
复制代码


(内容) 是一个变量,表示需要选择的字段名

论坛徽章:
0
7 [报告]
发表于 2009-06-12 10:47 |只看该作者
没看明白想要啥

论坛徽章:
0
8 [报告]
发表于 2009-06-16 17:44 |只看该作者

回复 #4 kwokcn 的帖子

如果内容中也包含引号,是不是这样就不好处理了?

论坛徽章:
0
9 [报告]
发表于 2009-06-16 17:45 |只看该作者
原帖由 springwind426 于 2009-6-12 08:47 发表

perl -e '
$s="";
while(){$s="$s$_";}
$s=~/((\[.*?\])?)(内容)="(.*?)"\1,?/s;
print "$4\n";'  datafile


(内容) 是一个变量,表示需要选择的字段名


这段是perl程序吗?没研究过这个,能简单说下吗?

论坛徽章:
0
10 [报告]
发表于 2009-06-17 01:01 |只看该作者
原帖由 kwokcn 于 2009-6-16 18:04 发表

那能不能确定引号部分不包含的字符呢?如果等号、引号、逗号、中括号、“标题”、“日期”、“内容”、“作者”这些都包含,大眼一看还真有点蒙~

本身这个文件的长内容是靠前后的唯一边界界定的,如果引号内没有其他东西的字段,一般就没有边界。
我现在的想法是把所有的\N删掉,然后用VIM正则表达式匹配,不知道成不成。

无论如何,非常感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP