3

我在 Mac Os X Snow Leopard 上运行 sed。

sed 是/应该是 BSD sed(手册页日期为 2005-05-10)手册页状态:

The sed utility is expected to be a superset of 
the IEEE Std 1003.2 (``POSIX.2'') specification.

当我尝试替换时,输入流包含大于 ascii 127 的字符,点与此字符不匹配。

例如

echo -e "a001\0001a - a127\0177a - a128\0200a - a255\0377a - a061\0075a" \
| sed -e 's/a[0-9]\{3\}.a/match/g;' ;
echo "result: $?";

结果输出:

match - match - a128?a - a255?a - match
result: 0

在 Os X Maverick (说明相同的手册页)上,结果给出了错误:

sed: RE error: illegal byte sequence
result: 1

在 linux Mint 13 系统上,返回相同的指令(我的期望):

match - match - match - match - match
result: 0

根据http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_03 '.' 应该匹配

"any character in the supported character set except NUL".

如果运行这个类似的命令(Os X Snow Leopard 上的 gsed 版本 4.2.1):

echo -e "a001\0001a - a127\0177a - a128\0200a - a255\0377a - a061\0075a"\
| gsed -e 's/a[0-9]\{3\}.a/match/g;';
echo "result: $?";

我得到了相同的(对我来说出乎意料的)结果:

match - match - a128?a - a255?a - match
result: 0
  1. 其他人有同样的行为吗?
  2. 能解释一下为什么吗?(这是 BSD 中的错误吗??)和/或如何规避/修复?我只能猜测它与“ supported character set”有关,然后在不同的系统上会有所不同......特别是因为在 SL 系统上,BSD sed 和 GNU sed 的行为相同。但是,我确实已经检查并更改了我的环境:在 SL 系统上:

    $> env | grep '^L'
    LANG=en_US.UTF-8
    LANGUAGE=en_US:en
    LC_CTYPE=UTF-8
    

    在薄荷系统上:

    $user@Mint > env | grep '^L'
    LANG=en_US.UTF-8
    LANGUAGE=en_US:en
    LC_CTYPE=UTF-8
    
4

1 回答 1

1

您的语言环境是 UTF-8,但您回显的字节序列不是有效的 UTF-8,因为\0200aand \0377a。如果您使用 set LC_ALL=en_US.ISO8859-1(iso-latin-1),那么它可以正常工作,因为结果echo是有效的 iso-latin-1 字符串。

于 2013-11-19T13:18:32.577 回答