正则表达式 – 使用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文档.

相关文章

正则替换html代码中img标签的src值在开发富文本信息在移动端...
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它...
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及...
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发...