微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正则表达式 – 使用sed,正则表达式如何匹配汉字?

我决定发布一个问题,花了很长时间后仍然没有弄清楚问题.还阅读了一堆看似相关的帖子,没有一个真的适合我的简单(?)问题.

所以我有一个可能很大的文本文件(> 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 举报,一经查实,本站将立刻删除。

相关推荐