我在 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
- 其他人有同样的行为吗?
能解释一下为什么吗?(这是 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