免费注册 查看新帖 |

Chinaunix

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

请教一个截取中文字符串的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-04 17:58 |只看该作者 |倒序浏览
如果想从一段中文截取个10个字, 比如用 cut -c1-20 时,如何避免取到半个汉字(比如前10个汉字的中间有半角的空格或字母时,最后一个汉字就可能取到一半,而出现乱码)? 谢谢

论坛徽章:
0
2 [报告]
发表于 2007-04-04 18:04 |只看该作者
  1. sed 's/^\(.\{10\}\).*/\1/' file
复制代码

论坛徽章:
0
3 [报告]
发表于 2007-04-04 18:09 |只看该作者
谢谢
好像不行啊,取出来的串最后一个是个 ?号,应该是乱码吧

论坛徽章:
0
4 [报告]
发表于 2007-04-04 18:13 |只看该作者
您的文件是什么编码?另外,把您的locale信息贴上来。

论坛徽章:
0
5 [报告]
发表于 2007-04-04 18:19 |只看该作者
就是一般用 vi 编的文本文件
比如 : cat a.txt
中国邮政贵州省
2中国邮政北京
中国邮政a上海

执行: sed 's/^\(.\{10\}\).*/\1/' a.txt
中国邮政贵
2中国邮政?
中国邮政a?

第二行和第三行应该是第10和11字节组成的一个完整汉字

论坛徽章:
0
6 [报告]
发表于 2007-04-04 18:27 |只看该作者
我姑且假定您的文件是GBK编码吧,那么请
  1. LANG=zh_CN.GBK sed 's/^\(.\{10\}\).*/\1/' file
复制代码

如果是GB2312或者GB18030请对应修改。

论坛徽章:
0
7 [报告]
发表于 2007-04-05 08:52 |只看该作者
谢谢
还是一样的结果啊
能不能实现如果第10个字符是某个汉字的一半时,少(或多)截取一个字符,就能保持取出来的字符串最后一个汉字是完整的了

论坛徽章:
0
8 [报告]
发表于 2007-04-05 10:04 |只看该作者
您用的什么系统的sed,或有否版本号?

我的gnu sed版本为4.1.5,ltrace可以看到它是使用宽字符作为字符单位的。
大家有非linux,或gnu sed版本较低的也来测试一下,或许其他版本的sed处理方式不同?

不过,以楼主您对编码的了解程度,我觉得是您操作有问题的可能偏大。
直到现在,您也没把locale信息贴上来,文件编码更是一定没弄清楚呢。先请google了解下编码和宽字符的概念,不然我说什么您很难理解。

论坛徽章:
0
9 [报告]
发表于 2007-04-05 17:10 |只看该作者
谢谢
我的是 unix 5.0.5 自带的 sed

论坛徽章:
0
10 [报告]
发表于 2007-04-18 09:33 |只看该作者
各位高手,帮忙看看能不能实现啊,感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP