我在 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 中的错误吗??)和/或如何规避/修复? 我只能猜测它与“
支持的字符集
”有关 然后在不同的系统上会有所不同.... 特别是因为在 SL 系统上,BSD sed 和 GNU sed 的行为相同。 但是我确实已经检查并更改了我的环境: 在 SL 系统上:$> env | grep '^L' LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_CTYPE=UTF-8
在 Mint 系统上:
$user@Mint > env | grep '^L' LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_CTYPE=UTF-8
最佳答案
您的语言环境是 UTF-8,但您回显的字节序列不是有效的 UTF-8,因为 \0200a
和 \0377a
。如果您使用 set LC_ALL=en_US.ISO8859-1
(iso-latin-1),那么它工作正常,因为 echo
的结果是一个有效的 iso-latin- 1 个字符串。
关于regex - 带有 BRE '.' 的 sed(在 osx Snow Leopard 上)不匹配字符 > ascii 127,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20072372/