用正常宽度等效替换全宽标点符号

时间:2011-05-02 18:10:57

标签: python bash unicode

file1包含一些 s(全宽)我想变成常规: s(这是我们的常规冒号)。我怎么在bash中这样做?也许是一个python脚本?

5 个答案:

答案 0 :(得分:4)

在充分尊重的情况下, python 不适合这项工作; perl 是:

perl -CSAD -i.orig -pe 'tr[:][:]' file1

perl -CSAD -i.orig -pe 'tr[\x{FF1A}][:]' file1

perl -CSAD -i.orig -Mcharnames=:full -pe 'tr[\N{FULLWIDTH COLON}][:]' file1

perl -CSAD -i.orig -Mcharnames=:full -pe 'tr[\N{FULLWIDTH EXCLAMATION MARK}\N{FULLWIDTH QUOTATION MARK}\{FULLWIDTH NUMBER SIGN}\N{FULLWIDTH DOLLAR SIGN}\N{FULLWIDTH PERCENT SIGN}\N{FULLWIDTH AMPERSAND}\{FULLWIDTH APOSTROPHE}\N{FULLWIDTH LEFT PARENTHESIS}\N{FULLWIDTH RIGHT PARENTHESIS}\N{FULLWIDTH ASTERISK}\N{FULLWIDTH PLUS SIGN}\N{FULLWIDTH COMMA}\N{FULLWIDTH HYPHEN-MINUS}\N{FULLWIDTH FULL STOP}\N{FULLWIDTH SOLIDUS}][\N{EXCLAMATION MARK}\N{QUOTATION MARK}\N{NUMBER SIGN}\N{DOLLAR SIGN}\N{PERCENT SIGN}\{AMPERSAND}\N{APOSTROPHE}\N{LEFT PARENTHESIS}\N{RIGHT PARENTHESIS}\N{ASTERISK}\N{PLUS SIGN}\N{COMMA}\{HYPHEN-MINUS}\N{FULL STOP}\N{SOLIDUS}]' file1

答案 1 :(得分:2)

您可能想要查看Python的unicodedata.normalize()

它允许您获取unicode字符串,并将其规范化为特定表单,例如:

unicodedata.normalize('NFKC', thestring)

以下是Unicode Standard Annex #15中不同规范化形式的表格:

enter image description here


如果您只想替换特定字符,可以使用unicode.translate()

>>> orig = u'\uFF1A:'
>>> table = {0xFF1A: u':'}
>>> print repr(orig)
>>> print repr(orig.translate(table))
u'\uFF1A:'
u'::'

答案 2 :(得分:2)

我同意Python不是用于此目的的最有效工具。虽然到目前为止提供的选项很好,sed是另一个很好的工具:

sed -i 's/\xEF\xBC\x9A/:/g' file.txt

-i选项使sed编辑文件,就像在tchrist的perl示例中一样。请注意,\xEF\xBC\x9A是UTF-8等效于UTF-16值\xFF1A。如果您需要处理相同Unicode值的不同编码,This page是一个有用的参考。

答案 3 :(得分:0)

您可以尝试tr

cat file.ext | tr ":" ":" > file_new.ext

答案 4 :(得分:0)

在Python 2.x中,您可以使用unicode.translate方法将单个Unicode代码点转换为0,1个或更多代码点,使用

replacement_string = original_string.translate(table)

以下代码设置了一个转换表,它将所有ASCII图形字符的全宽等效值映射到它们的ASCII等效字符:

# ! is 0x21 (ASCII) 0xFF01 (full); ~ is 0x7E (ASCII) 0xFF5E (full)
table = dict((x + 0xFF00 - 0x20, unichr(x)) for x in xrange(0x21, 0x7F))

(参考:见Wikipedia

如果您想要类似地处理空格,请执行table[0x3000] = u' '