我决定发布一个问题,花了很长时间后仍然没有弄清楚问题.还阅读了一堆看似相关的帖子,没有一个真的适合我的简单(?)问题.
所以我有一个可能很大的文本文件(> 1000行),其中包含普通话中文字符,其示例行如下:
"ref#2-5-1.jpg#2#一些 <variable> 内容#pic##" (the Chinese just means "some content").
所有需要修改的是,如果没有一个空格,则应在每个角色之间插入一个空格:
"ref#2-5-1.jpg#2#一 些 <variable> 内 容#pic##".
我开始天真地用以下简单的东西,但根本没有匹配:
sed -e 's/\([\u4E00-\u9fff]\)/\1 /g' <test_utf_sed.txt > test_out.txt
其中4E00-9fff应该是普通话的代码范围.
毫无疑问,这没有用,所以我也想尝试一下
sed -e 's/\([一-龻]\)/hello/g' <test_utf_sed.txt > test_out.txt
这失败了,因为我的bash无法显示(?)“一”字符.
然后我做了一些基本测试,但也失败了:
sed -e 's/\(\u4E00\)/hello/g' <test_utf_sed.txt > test_out.txt //一 sed -e 's/\(\u4E9B\)/hello/g' <test_utf_sed.txt > test_out.txt //些
与utf编码的另一种表示法相同(在stackoverflow上找到):
sed -e 's/\(\u'U+4E00\)/hello/g' <test_utf_sed.txt > test_out.txt
1)作为处理双字节字符的工具,是否是正确的选择?
2)是否能够处理unicode,还是需要特殊的开关?
3)我不是在寻找像这样的解决方案:
step1: insert space after each character //like 's/\(.\)/\1 /g') step2: remove space after each chacter which is not a Chinese character //like 's/\([a-zA-Z0-9]\) /\1/g')
我知道如何做到这一点,但它不优雅,容易出错.这必须可以在sed中使用正则表达式中的utf-8.
4)我的环境是MacOS 10.6.8(oldish OS)上的bash-3.2.
5)如果您知道某些开放的regEx-onliners作为处理中文文本或语言处理的库的指针,那么分享会很棒.
非常感谢您,非常感谢您的帮助!
解决方法
Perl对处理Unicode有很好的支持.对于你的任务而言,这可能比sed更好.这个单行程就像你的第一个sed示例:
perl -CIOED -p -e 's/\p{Block=CJK_Unified_Ideographs}/$& /g' filename
-CIOED告诉perl在utf8中执行其I / O. -p为输入文件的每一行运行给定代码一次,然后打印结果. -e指定要运行的一行Perl代码.有关更多信息,请参阅命令行参数上的the documentation.
正则表达式使用named ranges来标识要匹配的字符.
您可能还想阅读Perl Unicode文档.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。