swe*_*our 4 regex bash sed utf-8 chinese-locale
我花了一段时间后仍然不弄清楚问题,因此决定发布一个问题。还阅读了许多看似相关的帖子,但这些帖子都不符合我的简单(?)问题。
因此,我有一个可能很大的文本文件(> 1000行),其中包含普通话字符,示例行如下:
"ref#2-5-1.jpg#2#?? <variable> ??#pic##" (the Chinese just means "some content").
Run Code Online (Sandbox Code Playgroud)
需要修改的是,如果每个字符之间还没有空格,则应在其中插入一个空格:
"ref#2-5-1.jpg#2#? ? <variable> ? ?#pic##".
Run Code Online (Sandbox Code Playgroud)
我天真地从以下简单的东西开始,但是根本没有匹配项:
sed -e 's/\([\u4E00-\u9fff]\)/\1 /g' <test_utf_sed.txt > test_out.txt
Run Code Online (Sandbox Code Playgroud)
其中4E00-9fff应该是普通话的代码范围。毫无疑问,这没有用,所以我也想尝试
sed -e 's/\([?-?]\)/hello/g' <test_utf_sed.txt > test_out.txt
Run Code Online (Sandbox Code Playgroud)
这失败了,因为我的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 //?
Run Code Online (Sandbox Code Playgroud)
与utf编码的另一种表示法相同(可在stackoverflow上找到):
sed -e 's/\(\u'U+4E00\)/hello/g' <test_utf_sed.txt > test_out.txt
Run Code Online (Sandbox Code Playgroud)
1)作为处理双字节字符的工具,sed是否是正确的选择?
2)sed完全能够处理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')
Run Code Online (Sandbox Code Playgroud)
我知道该怎么做,但它既简单又容易出错。必须使用sed的regex中的utf-8。
4)我的环境是MacOS 10.6.8(较旧的操作系统)上的bash-3.2。
5)如果您知道一些指向某些开放式regEx联机语言的指针,例如处理中文文本或语言处理的库,那么共享该文档非常有用。
在此先感谢您,非常感谢您的帮助!
Perl对处理Unicode有很好的支持。与sed相比,这对您的任务而言可能是更好的选择。此单线工作方式类似于您的第一个sed示例:
perl -CIOED -p -e 's/\p{Script_Extensions=Han}/$& /g' filename
Run Code Online (Sandbox Code Playgroud)
将-CIOED
告诉Perl做它的I / O的UTF8。-p
对输入文件的每一行运行一次给定的代码,然后打印结果。-e
指定要运行的Perl代码行。有关更多信息,请参见命令行参数文档。
正则表达式使用命名范围来标识要匹配的字符。
您可能还需要阅读Perl Unicode文档。