免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 冰封三万里
打印 上一主题 下一主题

[文本处理] 处理一个xml文本文件 [复制链接]

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
11 [报告]
发表于 2016-06-02 14:40 |只看该作者
回复 1# 冰封三万里
awk -F '<|</' '!/xml/{for(i=1;i<=NF;i++) if ($i~/>/)a[gensub("([^>]+)(.*)","\\1","",$i)]++;for (i in a) if(a<2) print "<"i">";delete a}' file


   

论坛徽章:
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
12 [报告]
发表于 2016-06-02 14:54 |只看该作者
回复 7# 冰封三万里
试下,
  1. perl -nle 'next if(m~</?xml>~ or /\A\s*\z/);$L=$_;while(m~<([^>/]+)>~g){$l=$1;print "<$l>" if($L!~m~</$l>~)}' f
复制代码
<ab>
<fdgsfg>
<1234234>
<aaa>
<sdfsd>
<aaa>



   

论坛徽章:
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
13 [报告]
发表于 2016-06-02 15:13 |只看该作者
  1. awk -vRS='</?[^>]+>' '{
  2.     if(RT~"/"){
  3.         L=split(s,t,"<" substr(RT,3))
  4.         if(L<2){
  5.             print RT
  6.         }else if(L==2){
  7.             while(s!~" <" substr(RT,3)"$"){
  8.                 m=split(s,t)
  9.                 print t[m]
  10.                 s=gensub(" "t[m]"$","",1,s)
  11.             }
  12.             sub(" [^ ]+$","",s)
  13.         }
  14.     }else{
  15.     s=s" "RT
  16.     }
  17. }END{if(s!=" ")print gensub(" +","",1,s)}'
复制代码

论坛徽章:
0
14 [报告]
发表于 2016-06-02 16:41 |只看该作者
回复 12# sunzhiguolu


请问您这个  能把一行的 不做换行处理么?

   

论坛徽章:
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
15 [报告]
发表于 2016-06-02 17:47 |只看该作者
回复 14# 冰封三万里
试下,
  1. perl -ne 'next if(m~</?xml>~||/\A\s*\z/);$L=$_;my @a;while(m~<([^>/]+)>~g){$l=$1;push(@a,"<$1>") if($L!~m~</$l>~)}print"@a\n" if(@a)' f
复制代码
<ab>
<fdgsfg>
<1234234> <aaa>
<sdfsd> <aaa>

   

论坛徽章:
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
16 [报告]
发表于 2016-06-02 18:26 |只看该作者
本帖最后由 sunzhiguolu 于 2016-06-02 18:26 编辑

这样看着直观一点,
  1. perl -ne 'next if(m~</?xml>~||/\A\s*\z/);$L=$_;my @a;while(m~<([^>/]+)>~g){$l=$1;if($L!~m~</$l>~){!@a?($t="$./> <$1>"):($t="<$1>");push(@a,$t)}}print"@a\n" if(@a)' f
复制代码
3/> <ab>
4/> <fdgsfg>
6/> <1234234> <aaa>
9/> <sdfsd> <aaa>
cat -n f
     1  <xml>
     2  asjdf<a></a>kajs
     3  asdj<ab>bfkfk
     4  456456<fdgsfg>fghdfgh
     5
     6  5ASDsd<1234234>sdft<123er><abc>56<aaa>4e</abc></123er>
     7  ajsfk
     8
     9  ssfd<sdfsd><abc><aaa></abc>
    10  </xml>

论坛徽章:
0
17 [报告]
发表于 2016-06-03 09:41 |只看该作者
回复 16# sunzhiguolu


    it's great!

追问一下  我如果想把摘出来的东西  例如第一行 <ab>  我想把这个字符串中的 ‘<'  与'>'分别替换为    AAA_   与  _BBB

意思就是拼接为AAA_ab_BBB

然后把改后的结果  重新写入原文件

例如

原第三行   asdj<ab>bfkfk
更改后第三行    asdjAAA_ab_BBBbfkfk

谢谢~

论坛徽章:
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
18 [报告]
发表于 2016-06-03 10:16 |只看该作者
回复 17# 冰封三万里
文件中的 <xml> | </xml> 以及空白如何处理?

   

论坛徽章:
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
19 [报告]
发表于 2016-06-03 10:23 |只看该作者
本帖最后由 sunzhiguolu 于 2016-06-03 10:27 编辑

回复 17# 冰封三万里
我将其他的东西原样保留, 再试下:
  1. perl -i.bak -ne 'BEGIN{$B="AAA_";$E="_BBB"}{if(m~</?xml>~||/\A\s*\z/){print;next}$L=$_;my @a;while(m~<([^>/]+)>~g){$l=$1;push(@a,$1) if($L!~m~</$l>~)}foreach $t (@a) {s/<($t)>/$B$1$E/}print}' f
复制代码
cat f
--------------------------------------------------------------------------------------------
<xml>
asjdf<a></a>kajs
asdjAAA_ab_BBBbfkfk
456456AAA_fdgsfg_BBBfghdfgh

5ASDsdAAA_1234234_BBBsdft<123er><abc>56AAA_aaa_BBB4e</abc></123er>
ajsfk

ssfdAAA_sdfsd_BBB<abc>AAA_aaa_BBB</abc>
</xml>

cat f.bak
--------------------------------------------------------------------------------------------
<xml>
asjdf<a></a>kajs
asdj<ab>bfkfk
456456<fdgsfg>fghdfgh

5ASDsd<1234234>sdft<123er><abc>56<aaa>4e</abc></123er>
ajsfk

ssfd<sdfsd><abc><aaa></abc>
</xml>


   

论坛徽章:
0
20 [报告]
发表于 2016-06-03 11:45 |只看该作者
回复 19# sunzhiguolu

是的  就是这样~~

十分感谢~~



   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP