免费注册 查看新帖 |

Chinaunix

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

[文本处理] 【新增代码和贴图】shell 字符串中"\" 换行的不可见字符怎么处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-13 09:21 |只看该作者 |倒序浏览
本帖最后由 springlie 于 2014-01-13 10:49 编辑

写了一个echo的简单wrapper:cecho。 想根据一些flag去控制echo的行为(前景、背景等)。

cecho 中有个字符串 help_info,包含了所有的help信息。当执行 "cecho -help" 时,干了两件事:

1 用eval递归调用cecho显示带颜色效果的help_info

2 调用cecho显示help_info原始字符串,以便于跟上边的效果形成对比和示例。

因为不知道该用什么形式的字符串,出于调试的考虑,设定两个字符串help_info和help_info2,区别只是前者在行尾有'\',后者没有。

【图1】zsh + help_info :



【图2】zsh + help_info2 :



【图3】bash + help_info:



【图4】bash + help_info2:




解释:

【图1】是我想要的最终效果
【图2】中eval出错
【图3】eval中的cecho无法识别第一列的控制字符(因为有特殊字符存在);而且后面的原始字符串也被解释执行了。
【图4】eval中的cecho显示正常;后面的原始字符串被解释执行,且中间空格全部丢掉了。

问题:
怎么能有一份代码,使得在zsh和bash中达到正确显示的统一的效果(如【图1】)即可。

脚本代码见附件。

cecho.rar (1.47 KB, 下载次数: 4)

论坛徽章:
7
亥猪
日期:2013-10-10 17:00:29辰龙
日期:2013-10-12 16:23:19卯兔
日期:2013-11-18 17:01:27金牛座
日期:2014-09-09 10:17:052015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之柏太阳神
日期:2015-09-25 13:56:42数据库技术版块每日发帖之星
日期:2016-08-06 06:20:00
2 [报告]
发表于 2014-01-13 09:25 |只看该作者
本帖最后由 li0924 于 2014-01-13 09:26 编辑

cat -v file;可看到不可见字符;
你在用tr、sed修改文件

论坛徽章:
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
3 [报告]
发表于 2014-01-13 09:32 |只看该作者
回复 1# springlie


    少了引号吧。

   

论坛徽章:
2
亥猪
日期:2013-12-24 16:24:04狮子座
日期:2014-01-03 14:56:30
4 [报告]
发表于 2014-01-13 09:33 |只看该作者
sed  -ne "l" file
可查看不可见字符

论坛徽章:
0
5 [报告]
发表于 2014-01-13 09:44 |只看该作者
回复 3# blackold

sorry, 发帖时候笔误,已经加上了,与问题本身无关。


   

论坛徽章:
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
6 [报告]
发表于 2014-01-13 10:03 |只看该作者
$ cat e.sh
. ./myecho.sh
#set -x

str='myecho \
-t hello -n'

eval $str

#set +x

$ ./e.sh
        hello

论坛徽章:
0
7 [报告]
发表于 2014-01-13 10:41 |只看该作者
回复 6# jason680

我猜你测试用的不是bash。

原帖已更新增加大量细节(因为发现很难用一个小例子把问题说清楚。。。),请指教。


   

论坛徽章:
0
8 [报告]
发表于 2014-01-13 10:42 |只看该作者
回复 3# blackold

原帖更新了代码和贴图,请指教。


   

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

回复 7# springlie

Usually, I will program one transfer utility to generate two script from one source code.

1. define back slash with space
    WS="\\ "

2. use empty for default value of msg
   msg=""

3. add more case for -r, -g, -hl, ....
  -r | -red  )
  change to
  -r | \ -r| -red | \ -red )
  or
  -r | $WS-r| $WS-red | -red  )
  Note: define $WS ==> '\ '

4. defult case
  *)
   msg="msg$1 "

5. change help like this
    -h|-help|--help )
            eval $help_info
            echo $help_info | sed -r 's/\\/\\\n/g'
            #echo $help_src
            return ;;

6. # clear and #print
   # msg+=$DONE"\n"
   echo -e "$DONE$msg$DONE"

finally, you will see the result as like as your picture 1.
Note: sorry, I can't upload the picture successfully that is some network or other issue.

Note: I use it on Ubuntu 12.04 with bash only

论坛徽章:
0
10 [报告]
发表于 2014-01-13 15:54 |只看该作者
回复 9# jason680

多谢解答!

如果方便的话上传你的代码,我在zsh上测试一下,我觉得可能会有不同的结果。。。

在我的理解,这是一种见招拆招的方法使得cecho能在bash上表现正常。

希望在大家的帮助下:

第一步:得到在bash和zsh上都表现正常的代码

第二步:深入分析两个shell异同的原因

第三步:得到更加简洁优美的实现

再次感谢!


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP