file1
包含一些:
s(全宽)我想变成常规:
s(这是我们的常规冒号)。我怎么在bash中这样做?也许是一个python脚本?
答案 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中不同规范化形式的表格:
如果您只想替换特定字符,可以使用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' '