免费注册 查看新帖 |

Chinaunix

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

[文本处理] 彩色文本在busybox下显示异常 [复制链接]

论坛徽章:
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)] [报告]
发表于 2015-08-22 02:41 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2015-08-22 03:22 编辑

大家好!
我有一个问题向大家请教。

我写了一个小程序,对纯文本中的每一个字符以其ASCII编码的10进制值对7取模后按照"0红1绿2黄3蓝4紫5青6白"进行配色显示。
比如数字1的ASCII值为49,对7取模后为0,显示为红色;
字母a的ASCII值为97,对7取模后为6,显示为白色。
程序的代码如下:
  1. colorcat(){ awk -vFS='' 'BEGIN{for(i=0;i<8;i++)color[i]=sprintf("\033[%dm",i?i+30:i);for(j=32;j<127;j++)var[sprintf("%c",j)]=j}{for(i=1;i<=NF;i++)printf color[var[$i]%7+1]$i;print color[0]}' $*; }
复制代码
在实际执行中,发现在Linux环境下一切工作正常:
  1. [root@hp8:~]# echo "%%%%%%abc$%^%133"|colorcat
  2. %%%%%%abc$%^%133
  3. [root@hp8:~]# echo "abcdefg13454523463ALFDLdf"|colorcat
  4. abcdefg13454523463ALFDLdf
复制代码
显示效果如图:

但是在busybox环境下处理含有%和$等特殊符号的字符的文本时会出错,如果不含此类字符则工作正常:
  1. [root@pbox:~]# echo "%%%%%%abc$%^%133"|colorcat
  2. abc15824$^133
  3. [root@pbox:~]# echo "abcdefg13454523463ALFDLdf"|colorcat
  4. abcdefg13454523463ALFDLdf
复制代码
显示效果如图:

我将对有特殊字符的文本的处理后的结果重定向到文件,然后用vi打开后发现内容如下:
  1. ^[[37ma^[[31mb^[[32mc^[[31m1^[[35m5^[[31m8^[[32m2^[[34m4^[[32m$^[[34m^^[[31m1^[[33m3^[[33m3^[[0m
复制代码
可以发现原文本中的%处理后消失了,而$则更错得离谱,变成了莫名其妙不知道哪里冒出来的15824???
请问为什么会出现这种情况呢?
应该如何修改程序使得这些特殊字符也可以按照规则显示呢?
谢谢大家!

论坛徽章:
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
2 [报告]
发表于 2015-08-22 09:30 |只看该作者
$$ = PID ?

       $      Expands  to  the  process ID of the shell.  In a () subshell, it
              expands to the process ID of the current  shell,  not  the  sub‐
              shell.

论坛徽章:
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
3 [报告]
发表于 2015-08-22 10:03 |只看该作者
本帖最后由 bikkuri 于 2015-08-22 10:10 编辑

看来应该是父进程sh的PID,所以每次执行的结果都是一样的。
但是换另外一台busybox,执行的结果和前一台不一样,但是又是每次都一样。

  1. [root@ubox:~]# echo "%%%%%%abc$%^%133"|colorcat
  2. abc26517$^133
  3. [root@ubox:~]# echo "%%%%%%abc$%^%133"|colorcat
  4. abc26517$^133
  5. [root@ubox:~]# ps -ww|grep 26517
  6. 26517 root       892 S    -sh
  7. [root@ubox:~]# echo "%%%%%%abc$$%^%133" > file
  8. [root@ubox:~]# cat file
  9. %%%%%%abc26517$%^%133
  10. [root@ubox:~]# colorcat file
  11. abc26517$^133
复制代码
为什么在Linux环境下却不被解释成父进程的PID?
还有为什么%会消失?
有没有办法在busybox下避免这些问题,达到和Linux环境下一样的显示效果呢?


回复 2# jason680


   

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
4 [报告]
发表于 2015-08-22 15:09 |只看该作者
回复 1# bikkuri

LZ 我有一个问题请教
请问神马 是 busybox
谢谢!

论坛徽章:
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 [报告]
发表于 2015-08-22 20:58 |只看该作者
本帖最后由 jason680 于 2015-08-22 21:38 编辑

回复 3# bikkuri

1. $$ is PID

2. the percent(%) bug here and debug by yourself
{for(i=1;i<=NF;i++)printf color[var[$i]%7+1]$i;print color[0]}' $*; }


# There is no issue in echo
~/tmp $ busybox echo "%%%%%%abc$%^%133" | hexdump -C
00000000  25 25 25 25 25 25 61 62  63 24 25 5e 25 31 33 33  |%%%%%%abc$%^%133|
00000010  0a                                                |.|


~/tmp $ busybox echo "%%%%%%abc$%^%133" | colorcat
abc$^133
~/tmp $ busybox echo "%%%%%%abc$%^%133" | colorcat2
%%%%%%abc$%^%133

Note: Output string is colorful by colorcat and colorcat2   
colorcat(){ busybox awk '{...}' $*; }     # your code and got some issue, ex: %
colorcat2(){ busybox awk '{...}' $*; }   # modified without % issue

论坛徽章:
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 [报告]
发表于 2015-08-22 23:23 |只看该作者
谢谢指点。改成如下以后%的问题解决了。
  1. [enb@hp8:~]$ colorcat(){ busybox awk -vFS='' 'BEGIN{for(i=0;i<8;i++)color[i]=sprintf("\033[%dm",i?i+30:i);for(j=32;j<127;j++)var[sprintf("%c",j)]=j}{for(i=1;i<=NF;i++)printf (color[var[$i]%7+1]"%s",$i);print color[0]}' $*; }
  2. [enb@hp8:~]$ echo "%%%%%%abc$$%^%133"|colorcat
  3. %%%%%%abc14376$%^%133
复制代码
但是$$的问题还是没有办法解决吗?


回复 5# 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
7 [报告]
发表于 2015-08-22 23:52 |只看该作者
回复 6# bikkuri

基础

shell 十三問?
http://bbs.chinaunix.net/thread-218853-1-1.html

shell基础二十篇
http://bbs.chinaunix.net/thread-452942-1-1.html



   

论坛徽章:
7
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:18程序设计版块每日发帖之星
日期:2015-08-09 06:20:00每日论坛发贴之星
日期:2015-08-09 06:20:00程序设计版块每日发帖之星
日期:2015-08-22 06:20:00程序设计版块每日发帖之星
日期:2015-08-27 06:20:00
8 [报告]
发表于 2015-08-24 10:35 |只看该作者
busybox 到底是啥。。度娘的结果我都看不懂~~

论坛徽章:
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
9 [报告]
发表于 2015-08-25 08:44 |只看该作者
本帖最后由 bikkuri 于 2015-08-25 08:54 编辑

busybox就是小忙盒,是一个集成了一百多个linux命令和工具的工具箱,常用于嵌入式系统。


回复 8# tuyajie


   

论坛徽章:
7
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:18程序设计版块每日发帖之星
日期:2015-08-09 06:20:00每日论坛发贴之星
日期:2015-08-09 06:20:00程序设计版块每日发帖之星
日期:2015-08-22 06:20:00程序设计版块每日发帖之星
日期:2015-08-27 06:20:00
10 [报告]
发表于 2015-08-25 09:22 |只看该作者
长见识了 回复 9# bikkuri


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP