我想为文本文件中的每个字符添加空格
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 寸 的 , 很 小 的 ?
看 来 还 是 美
答案 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 寸 的 , 很 小 的 ?
看 来 还 是 美 国 的 便 宜 啊
应 该 是 吧