在unicode文件的每个字符后面添加空格时出现区域设置错误?

时间:2015-01-28 12:52:34

标签: bash unicode utf-8 sed locale

我想为文本文件中的每个字符添加空格

in.txt

在吗??
嗯
你让我看的那款手提是不是11寸的,很小的?
看来还是美国的便宜啊
应该是吧

out.txt

在 吗 ? ?
嗯
你 让 我 看 的 那 款 手 提 是 不 是 1 1 寸 的 , 很 小 的 ?
看 来 还 是 美 国 的 便 宜 啊
应 该 是 吧

我已经尝试了这个(How to remove/add spaces in all textfiles?)但输出了:

� � � � � � � � � � � � 
� � � 
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 1 1 � � � � � � � � � � � � � � � � � � � � 
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � 
� � � � � � � � � � � � 

如何实现out.txt


我也试过了:

$ perl -F'' -C -lane 'print join " ", @F' in.txt 
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_PAPER = "de_DE.UTF-8",
    LC_ADDRESS = "de_DE.UTF-8",
    LC_MONETARY = "de_DE.UTF-8",
    LC_NUMERIC = "de_DE.UTF-8",
    LC_TELEPHONE = "de_DE.UTF-8",
    LC_IDENTIFICATION = "de_DE.UTF-8",
    LC_MEASUREMENT = "de_DE.UTF-8",
    LC_TIME = "de_DE.UTF-8",
    LC_NAME = "de_DE.UTF-8",
    LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
� � � � � � � � � � � �
� � �
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 1 1 � � � � � � � � � � � � � � � � � � � �
� � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � � � � � � � � � �

$ cat in.txt 在吗??
嗯
你让我看的那款手提是不是11寸的,很小的?
看来还是美国的便宜啊
应该是吧
$ sed 's/\s/g;s/./& /g'  in.txt
sed: -e expression #1, char 10: unknown option to `s'

我的语言环境似乎有问题:

$ locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME=de_DE.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=

为了解决这个问题,我必须这样做:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

然后:

$ perl -F'' -C -lane 'print join " ", @F' in.txt 
在 吗 ? ?
嗯
你 让 我 看 的 那 款 手 提 是 不 是 1 1 寸 的 , 很 小 的 ?
看 来 还 是 美

2 个答案:

答案 0 :(得分:1)

假设您正确设置了UTF-8语言环境,您可以使用此Perl单行程序:

perl -F'' -C -lane 'print join " ", @F' in.txt > out.txt

-a开关将字段分隔符上的输入拆分,该字符串已设置为空字符串,因此每个字符都是数组@F中的单独元素。由于这使用了join,因此在该行的最后一个字符之后没有添加空格(它不清楚是否应该有一个)。

另一个选择是使用替换:

perl -C -pe 's/(.)/$1 /g' in.txt > out.txt

这将在每个角色后面添加一个空格,包括最后一个角色。

答案 1 :(得分:1)

检查UTF-8是否设置正确,

env | grep -i utf
LANG=en_US.UTF-8

您可以参考以下链接了解有关语言设置的更多信息。

http://perlgeek.de/en/article/set-up-a-clean-utf8-environment

以下oneliner工作正常。

 sed 's/\s/g;s/./& /g'  in.txt

以下是示例输出:

sed 's/\s//g;s/./& /g'  in.txt 
在 吗 ? ? 
嗯 
你 让 我 看 的 那 款 手 提 是 不 是 1 1 寸 的 , 很 小 的 ? 
看 来 还 是 美 国 的 便 宜 啊 
应 该 是 吧