我有一个用 utf8 编码的 bash 脚本。
在脚本中我使用 sed 命令§
作为分隔符。
现在,当我运行执行时,该脚本sed
会对分隔符提出抱怨。
如果我使用普通字符作为 ex 的分隔符,@
那么一切都正常。
我已经查看了 putty 中的脚本[在 putty 中设置 utf8]并且字符显示正常。
locale
命令还显示 Linux 默认字符集
LC_CSET=en_US.UTF-8
可能出了什么问题?
以前我使用 windows-1252 编码来编写 shell 脚本,而且这种方法曾经有效。
答案1
您的版本可能sed
不支持多字节分隔符。如果您查看§
两种字符集中的编码方式,就会发现差异:
% locale
LANG="en_CA.UTF-8"
LC_COLLATE="en_CA.UTF-8"
LC_CTYPE="en_CA.UTF-8"
LC_MESSAGES="en_CA.UTF-8"
LC_MONETARY="en_CA.UTF-8"
LC_NUMERIC="en_CA.UTF-8"
LC_TIME="en_CA.UTF-8"
LC_ALL=
% printf § > section.utf8
% hexdump -C section.utf8
00000000 c2 a7 |..|
00000002
% iconv -f UTF-8 -t WINDOWS-1252 < section.utf8 > section.win1252
% hexdump -C section.win1252
00000000 a7 |.|
00000001
不同版本sed
会给出或多或少有用的信息。在我的 OS X 10.6 系统上,我得到了一些有点神秘的信息:
% sed 's§foo§bar§'
sed: 1: "s§foo§bar§": RE error: illegal byte sequence
Ubuntu 10.04 LTS 使用的版本sed
更有帮助:
% sed 's§foo§bar§'
sed: -e expression #1, char 2: delimiter character is not a single-byte character