我有一个包含大量文字的文件,并且混合了特殊的空格字符, 那些是Unicode Spaces
我需要用普通“空格”字符替换所有这些字符。
答案 0 :(得分:5)
轻松使用perl:
perl -CSDA -plE 's/\s/ /g' file
但正如@ mklement0在评论中所说,它也会匹配\t
(TAB)。如果这是问题,您可以使用
perl -CSDA -plE 's/[^\S\t]/ /g'
演示:
X X
上面包含:
U+00058 X LATIN CAPITAL LETTER X
U+01680 OGHAM SPACE MARK
U+02002 EN SPACE
U+02003 EM SPACE
U+02004 THREE-PER-EM SPACE
U+02005 FOUR-PER-EM SPACE
U+02006 SIX-PER-EM SPACE
U+02007 FIGURE SPACE
U+02008 PUNCTUATION SPACE
U+02009 THIN SPACE
U+0200A HAIR SPACE
U+0202F NARROW NO-BREAK SPACE
U+0205F MEDIUM MATHEMATICAL SPACE
U+03000 IDEOGRAPHIC SPACE
U+00058 X LATIN CAPITAL LETTER X
使用:
perl -CSDA -plE 's/\s/_/g' <<<"X X"
请注意,对于替换为下划线的演示,请打印
X_____________X
也可以使用纯bash
LC_ALL=en_US.UTF-8 spaces=$(printf "%b" "\U00A0\U1680\U180E\U2000\U2001\U2002\U2003\U2004\U2005\U2006\U2007\U2008\U2009\U200A\U200B\U202F\U205F\U3000\UFEFF")
while read -r line; do
echo "${line//[$spaces]/ }"
done
仅当您的默认语言区域不是LC_ALL=en_US.UTF-8
时才需要UTF-8
。 (你应该有,如果你使用utf8文本):)
演示:
str="X X"
echo "${str//[$spaces]/_}"
再次打印:
X_____________X
使用sed
相同 - 如上所述准备变量$spaces
并使用:
sed "s/[$spaces]/ /g" file
修改 - 因为一些奇怪的复制/粘贴(或Locale)问题:
xxd -ps <<<"$spaces"
显示
c2a0e19a80e1a08ee28080e28081e28082e28083e28084e28085e28086e2
8087e28088e28089e2808ae2808be280afe2819fe38080efbbbf0a
md5
摘要(两个不同的程序)
md5sum <<<"$spaces"
LC_ALL=C md5 <<<"$spaces"
打印相同的md5
35cf5e1d7a5f512031d18f3d2ec6612f -
35cf5e1d7a5f512031d18f3d2ec6612f
答案 1 :(得分:1)
可以通过unicode识别字符,不幸的是python3 -m django startproject mysite
不会这样做。
通过重新处理另一个SO answer,我们列出所有unicodes将它们保存在变量中,然后使用sed进行替换(注意使用sed 's/[[:space:]]\+/\ /g'
我们还将保存原始文件的副本)
-i.bak
答案 2 :(得分:1)
如果您反复遇到此任务,请考虑安装 nws
( n ormalize w hite s pace),一个简化任务的实用工具:
nws --ascii file # convert non-ASCII whitespace and punctuation to ASCII
nws --ascii -i file # update file in place
--ascii
的{{1}}模式:
音译(非ASCII)Unicode空格(例如不间断空格(nws
))和标点符号(例如弯引号(
),短划线({{ 1}}),...)到他们最接近的ASCII等价物
,只留下任何其他Unicode字符。
此模式对于已经过格式化的源代码示例非常有用,这些示例使用印刷引号,破折号等进行显示,这通常会使代码对编译器/解释器无法消除。
“”
注意:即使您不使用Node.js,–
,它的软件包管理器也可以跨平台运行,并且易于安装;尝试
curl -L https://git.io/n-install | bash
安装Node.js后,按如下方式安装:
nws
注意强>:
npm
取决于您安装Node.js的方式以及您是否changed permissions later;如果您收到[sudo] npm install nws-cli -g
错误,请使用sudo
再次尝试。EACCES
确保global installation,并且需要将sudo
放入您的系统-g
。nws-cli
的Unix平台)bash
script下载为$PATH
。bash
使其可执行。nws
中的文件夹,例如chmod +x nws
(macOS)或$PATH
(Linux)。/usr/local/bin
和/usr/bin
以及非ASCII Unicode空格 在基于UTF-8的语言环境中,POSIX兼容的实用程序应该使POSIX字符类[:space:]
和[:blank:]
匹配(非ASCII)Unicode空白< /强>
这依赖于语言环境charmap基于POSIX-mandated character classifications的Unicode字符的正确分类,它直接对应于[:space:]
等字符类,可用于模式和正则表达式。
有两个陷阱:
Unicode是一个不断发展的标准(撰写本文时的第9版); 您的平台的UTF-8 charmap可能不是最新的。
[:blank:]
上,以下字符未正确分类,因此未与[:space:]
/ Ubuntu 16.04
匹配:实用程序应该使用活动区域设置的charmap - 但是有令人遗憾的例外 - 以下实用程序不支持Unicode (可能还有更多):
在GNU实用程序中(自coreutils v8.27起):
[:space:]
,[:blank:]
Mawk,例如Ubuntu默认的cut
实现。
在BSD / macOS实用程序中(从macOS 10.12开始):
tr
因此,在具有当前UTF-8 charmap的平台上,以下awk
命令应该有效,但请注意awk
也匹配 tab 字符,因此替换它们也只有一个空格:
sed
答案 3 :(得分:0)
如果你使用python3这对我有用,它的临时代码却可以工作。
FILENAME = 'File.txt'
OUTPUTNAME = 'Fixed.txt'
f = open(FILENAME, 'r+', encoding='utf8')
o = open(OUTPUTNAME, 'w+', encoding='utf8')
for line in f:
for ch in line:
if ch == '\u2003':
ch = ' '
o.write(ch)
else:
o.write(ch)
o.close()
f.close()