免费注册 查看新帖 |

Chinaunix

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

[文本处理] 文本转换求助-ASCII控制文本转HTML [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-04 04:04 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2014-02-03 23:36 编辑

大家新年好!
有一个新问题向大家请教。
我有一些含有ASCII控制字符的文本,以下是一个例子:
  1. ^[[1;33;40mCurrent time is^[[31m Tue Feb  4 03:25:29 UTC 2014^[[m
  2. ^[[1;33;40mSystem has been up for^[[31m 9 hours 12 minutes ^[[m
  3. ^[[1;33;40mProgram has been executed for^[[31m 111 ^[[33mtimes^[[m
复制代码
其中的ASCII控制字符都是以ESC字符(^[或者\033)开头,以m结尾。例如第一行:
^[[1;33;40m中1表示高亮,33表示字体颜色为黄色,40表示背景色为黑色
^[[35m表示将字体颜色改成红色
^[[m表示本行控制结束,所有属性清空
我希望用sed或者awk将这样的文本转换成HTML文件。例如上面这个例子,转换成:
  1. <body bgcolor=black><table border='1' align='center'><tr><td><tt><font size='+2'>
  2. <font color=yellow>Current time is</font><font color=red> Tue Feb  4 03:25:29 UTC 2014</font><br>
  3. <font color=yellow>System has been up for</font><font color=red> 9 hours 12 minutes</font><br>
  4. <font color=yellow>Program has been executed for</font><font color=red> 111 </font><font color=yellow>times</font><br>
  5. </tt></td></tr></table></body>
复制代码
第一行和第五行可以看作是外加的固定内容,问题是如何用sed或者awk将第一段ASCII控制文本转换成第二段中第2到第4行的HTML内容?
^[[1;33;40m变成<font color=yellow>
^[[31m变成</font><font color=red>
^[[33m变成</font><font color=yellow>
^[[m变成</font><br>
由于我对HTML也不是很熟,如果大家有更好的办法也请赐教!
谢谢大家!

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
2 [报告]
发表于 2014-02-04 11:36 |只看该作者
本帖最后由 bikkuri 于 2014-02-04 04:37 编辑

我试着写了一下,以下代码可以输出正确结果。
  1. awk '{gsub(/\033\[1\;31\;40m/,"<font color=red>",$0);gsub(/\033\[1\;32\;40m/,"<font color=lime>",$0);gsub(/\033\[1\;33\;40m/,"<font color=yellow>",$0);gsub(/\033\[1\;34\;40m/,"<font color=blue>",$0);gsub(/\033\[1\;35\;40m/,"<font color=magenta>",$0);gsub(/\033\[1\;36\;40m/,"<font color=cyan>",$0);gsub(/\033\[1\;37\;40m/,"<font color=white>",$0);gsub(/\033\[31m/,"</font><font color=red>",$0);gsub(/\033\[32m/,"</font><font color=lime>",$0);gsub(/\033\[33m/,"</font><font color=yellow>",$0);gsub(/\033\[34m/,"</font><font color=blue>",$0);gsub(/\033\[35m/,"</font><font color=magenta>",$0);gsub(/\033\[36m/,"</font><font color=cyan>",$0);gsub(/\033\[37m/,"</font><font color=white>",$0);gsub(/\033\[m/,"</font><br>",$0);print $0}'
复制代码
这里重复的内容很多,不知道有没有精简的写法?

论坛徽章:
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
3 [报告]
发表于 2014-02-05 11:41 |只看该作者
本帖最后由 jason680 于 2014-02-05 15:16 编辑

回复 2# bikkuri

How about this way
^[[1;3x;40m
  RLENGTH=10, substr($0, s+4,2) = 3x,  e="", t="<font color=XXXX>"
^[[3xm
  RLENGTH=5, substr($0, s+2,2) = 3x, e="</font>", t="<font color=XXXX>"
^[[m
  RLENGTH=3, e="</font>", t="<br>"


$ cat color
31 red
32 lime
33 yellow
34 blue
35 magenta
36 cyan
37 white

$ awk 'BEGIN{cmd="cat color";while(cmd|getline){c[$1]=$2}}function chg(e,t,s,x,p){p=2;s=RSTART;x=RLENGTH;e="</font>";if(x>4){if(x>9){e="";p+=2}t="<font color="c[substr($0,s+p,2)]">"}else{t="<br>"}sub(/\033\[[0-9;]*m/,e""t,$0)}{while(match($0,/\033\[[0-9;]*m/))chg()}1' FILE
<font color=yellow>Current time is</font><font color=red> Tue Feb  4 03:25:29 UTC 2014</font><br>
<font color=yellow>System has been up for</font><font color=red> 9 hours 12 minutes </font><br>
<font color=yellow>Program has been executed for</font><font color=red> 111 </font><font color=yellow>times</font><br>

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
4 [报告]
发表于 2014-02-05 13:59 |只看该作者
谢谢您的答复。这样改确实代码精简了很多,但是让awk从文件中读取颜色代码的做法却要多用一个文件。
能不能不用文件,直接给数组赋值呢?

回复 3# jason680


   

论坛徽章:
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
5 [报告]
发表于 2014-02-05 15:14 |只看该作者
本帖最后由 jason680 于 2014-02-05 15:15 编辑

回复 4# bikkuri

you can modify it by yourself for color table in BEGIN block

31 red
32 lime
...

BEGIN{c["31"]="red";c["32"]="lime"; ...}

   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
6 [报告]
发表于 2014-02-07 14:38 |只看该作者
谢谢!我把7种颜色全部手工加到BEGIN模块之后的代码仍然比我原来的代码短了一半以上!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP